2017-01-08 1 views
1

でLINQを使用する:私はどのグループFileInfosの一覧を次のコードを持っている場合、クエリ

  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 
等がSAの構文を知っています

しかし、これで2つの属性を選択してみましょう...

あなたはアイデアを持っていますか?

+0

もっと条件が必要ですか? – procma

+0

いいえ、私はユーザーが望んでいるグループ方法をチェックしたいと思います。名前でグループ化したい場合:名前でグループ化します。長さでグループ化したい場合:長さでグループ化します。彼がグループ化したいのであれば....... – Chpo7234

答えて

1

ここではクエリ構文の代わりにメソッド構文を使用することができますが、これは私の意見ではより管理しやすく、読みやすくなります。あなたがシステムを使用することができ、Additionaly

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); 

たとえば、キーセレクター関数でグループを返すメソッド作ることができます:

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; 
} 

を下記のように、あなたはそれを使用することができます.Net.Reflectionライブラリswitch-caseGetGroupByKeySelectorメソッドの中であなたの列挙型がFileInfoのプロパティ名を反映している場合は避けてください。

関連する問題