2017-01-08 6 views
1

У меня есть следующий код, который группы список FileInfos:Использование LINQ с, если-запрос

  var group_infos = 
      from info in fileInfos 
      where info.Length < 1024 * 1024 
      group info by info.Name into g 
      where g.Count() > 1 
      orderby g.Count() descending, g.Key 
      select g; 

Теперь я хочу сделать, если-запрос на групповой clausel. Может быть, с помощью строки

string groupClausel = "Name"; 

или перечисления:

public enum FilterMethod 
    { 
     Directory, 
     CreationTime, 
     DirectoryName, 
     Extension, 
     Length, 
     Name 
    } 

Но я не знаю, как проверить строку или перечисление в групповой clausel .. Я знаю, что са синтаксис как

group info by (groupClausel == "Extension" ? info.Extension : info.Name) into g 

Но это позволило мне выбрать только два атрибута ...

У вас есть идеи?

+0

Значит, вы хотите больше условий? – procma

+0

Нет, я хочу проверить, какой групповой метод хочет пользователь. Если он хочет группировать по имени: group by name. Если он хочет группировать по длине: группа по длине. если он хочет сгруппировать по ....... – Chpo7234

ответ

1

Здесь вы можете использовать синтаксис метода вместо синтаксиса запроса, он будет более удобным и удобным для чтения в моем оппионе.

Например, вы могли бы сделать метод, который возвращает группу по ключевой функцией выбора:

private Func<FileInfo, object> GetGroupByKeySelector(FilterMethod filterMethod) 
{ 
    Func<FileInfo, object> keySelector = null; 
    switch (filterMethod) 
    { 
     case FilterMethod.Directory: 
      keySelector = f => f.Directory; 
      break; 

     case FilterMethod.CreationTime: 
      keySelector = f => f.CreationTime; 
      break; 

     case FilterMethod.DirectoryName: 
      keySelector = f => f.DirectoryName; 
      break; 

     case FilterMethod.Extension: 
      keySelector = f => f.Extension; 
      break; 

     case FilterMethod.Length: 
      keySelector = f => f.Extension; 
      break; 

     default: 
      keySelector = f => f.Name; 
      break; 
    } 
    return keySelector; 
} 

И тогда вы можете использовать его, как описано ниже:

FilterMethod prop = FilterMethod.CreationTime; 
var groupInfos = fileInfos 
    .Where(f => f.Length < 1024 * 1024) 
    .GroupBy(GetGroupByKeySelector(prop)) 
    .Where(g => g.Count() > 1) 
    .OrderByDescending(g => g.Count()) 
    .OrderBy(g => g.Key) 
    .Select(g => g); 

Additionaly, вы можете использовать систему .Net.Reflection library, чтобы избежать switch-case внутри метода GetGroupByKeySelector, если ваше перечисление отражает FileInfo имена свойств.