1

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;

今、グループクローセルでifクエリを実行したいと考えています。多分文字列の助けを借りて

string groupClausel = "Name";

または列挙:

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

しかし、group-clauselで文字列または列挙型をチェックする方法がわかりません。次のような構文があることは知っています

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

しかし、これにより、2 つの属性を選択することができます...

アイデアはありますか?

4

1 に答える 1

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

さらに、列挙型がプロパティ名を反映している場合は、System.Net.Reflection ライブラリを使用してメソッドswitch-case内を回避できます。GetGroupByKeySelectorFileInfo

于 2017-01-08T18:12:52.953 に答える