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 info by (groupClausel == "Extension" ? info.Extension : info.Name) into g

但这让我只选择两个属性......

你们有想法吗?

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 回答