将 linq 与 if 查询一起使用

Using linq with if-query

我有以下代码将文件信息列表分组:

            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

但这让我 select 有两个属性...

你们有想法吗?

你可以在这里使用方法语法而不是查询语法,在我看来它会更易于维护和阅读。

例如,您可以创建一个 returns 分组按键选择器函数的方法:

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

此外,如果您的枚举反映了 FileInfo 属性 名称,您可以使用 System.Net.Reflection 库来避免在 GetGroupByKeySelector 方法中使用 switch-case