重写Linq查询以使用if / else并丢弃var

本文关键字:else var if 查询 Linq 重写 | 更新日期: 2023-09-27 18:05:46

我最近开始玩Linq(提示呻吟),我试图得到以下编译。现在,where子句部分使用DynamicLinq,它工作得很好;它是var占位符变量,编译器想要一个真正的类;不幸的是,我正在使用我认为是一个匿名类,我不确定如何从这里采取它。有什么建议吗?

var query;
if(whereclause != string.Empty) 
{
    query = Directory.GetFiles(LRSettings.Default.OperatingDirectory, LRSettings.Default.FileExtension,
    SearchOption.AllDirectories).AsQueryable()
        .Select(Filename => new { Filename, new FileInfo(Filename)
        .LastWriteTime, new FileInfo(Filename).Extension, new FileInfo(Filename).Length })
        .Where(whereclause);
}
else 
{
    query = Directory.GetFiles(LRSettings.Default.OperatingDirectory,
                               LRSettings.Default.FileExtension,
                               SearchOption.AllDirectories)
        .AsQueryable()
        .Select(Filename => new { Filename, new FileInfo(Filename).LastWriteTime, new FileInfo(Filename).Extension, new FileInfo(Filename).Length });
}

重写Linq查询以使用if / else并丢弃var

由于似乎查询中的唯一区别是是否包含WHERE子句,您应该能够这样做:

var query = Directory.GetFiles(LRSettings.Default.OperatingDirectory, LRSettings.Default.FileExtension, SearchOption.AllDirectories)
        .AsQueryable()
        .Select(Filename => new { Filename, new FileInfo(Filename).LastWriteTime, new FileInfo(Filename).Extension, new FileInfo(Filename).Length });
if(whereclause != string.Empty) 
{
    query = query.Where(whereclause);
}

由于您使用的是IEnumerable,我认为您不必担心在没有Where()子句的情况下提取太多数据,因为它不会被枚举,直到您以某种方式访问query(如绑定到表单或诸如此类)。

两个直接的选择是使用?:或提取公共/开始查询。

对于前者:

bool expr = SomeTrueOrFalseValue();
var l = new [] { 1,2,3 };
// both "true" and "false" branches unify an IEnumerable<int>
var q = expr
  ? l
  : l.Where(x => x > 1);
// q typed as IEnumerable<int>

对于后者:

var q = l.AsEnumerable();
// q is typed as IEnumerable<int>
if (!expr) {
    q = q.Where(x => x > 1);
}
// q is still typed as IEnumerable<int> - can't be changed after var

赋值必须包含在var声明中,以便确定变量的类型。

但是没有var:

IEnumerable<int> q; // not practical/possible for complex types
if (expr) {
   q = l;
} else {
   q = l.Where(x => x > 1);
}