将 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
。
我有以下代码将文件信息列表分组:
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
。