C# 如何在lambda表达式中返回不同的数据类型?
我想获得以下功能。但由于我必须返回不同的数据类型,因此不允许使用该方法。在这种情况下,我会怎么做C# 如何在lambda表达式中返回不同的数据类型?,c#,linq,lambda,C#,Linq,Lambda,我想获得以下功能。但由于我必须返回不同的数据类型,因此不允许使用该方法。在这种情况下,我会怎么做 .OrderBy(X => { switch (OrderByColumn) { case "": return X.a.CreatedOn; case "BookCategoryNam
.OrderBy(X =>
{
switch (OrderByColumn)
{
case "":
return X.a.CreatedOn;
case "BookCategoryName":
return X.a.BookCategoryName;
case "BookCategoryDescription":
return X.a.BookCategoryDescription;
}
return X.a.CreatedOn;
});
或任何其他获得此功能的建议?我建议您更改生成查询的逻辑,而不是在lambda中创建此类逻辑: 在类似之前生成查询:
var query = list.Where(...);
if(OrderByColumn=="BookCategoryName")
{
query = query.OrderBy(x=>x.a.BookCategoryName);
}
....
最后:
var result = query.ToList(); //for e.g.
它将根据您的需要工作,并且看起来更干净我建议您更改构建查询的逻辑,而不是在lambda中创建这样的逻辑: 在类似之前生成查询:
var query = list.Where(...);
if(OrderByColumn=="BookCategoryName")
{
query = query.OrderBy(x=>x.a.BookCategoryName);
}
....
最后:
var result = query.ToList(); //for e.g.
它将根据您的需要工作,并且看起来更干净对于当前lambda可能返回的每个数据类型,使用单独的块定义顺序,对于不使用该返回类型的任何选项,返回常量 目前,假设
CreatedOn
是一个DateTime
和BookCategoryName
和BookCategoryDescription
是字符串,它将类似于:
.OrderBy(X =>
{
switch (OrderByColumn)
{
case "":
return X.a.CreatedOn;
case "BookCategoryName":
return new DateTime(1900,1,1);
case "BookCategoryDescription":
return new DateTime(1900,1,1);
}
return X.a.CreatedOn;
})
.ThenBy(X =>
{
switch (OrderByColumn)
{
case "":
return "";
case "BookCategoryName":
return X.a.BookCategoryName;
case "BookCategoryDescription":
return X.a.BookCategoryDescription;
}
return "";
});
(当然,常量值可以移到实数常量或变量等,但我想让上面的代码片段自包含)对于当前lambda可能返回的每个数据类型,使用单独的块定义顺序,对于不使用该返回类型的任何选项,返回常量 目前,假设
CreatedOn
是一个DateTime
和BookCategoryName
和BookCategoryDescription
是字符串,它将类似于:
.OrderBy(X =>
{
switch (OrderByColumn)
{
case "":
return X.a.CreatedOn;
case "BookCategoryName":
return new DateTime(1900,1,1);
case "BookCategoryDescription":
return new DateTime(1900,1,1);
}
return X.a.CreatedOn;
})
.ThenBy(X =>
{
switch (OrderByColumn)
{
case "":
return "";
case "BookCategoryName":
return X.a.BookCategoryName;
case "BookCategoryDescription":
return X.a.BookCategoryDescription;
}
return "";
});
(当然,常量值可以移出为实数常量或变量等,但我想让上面的代码片段自包含),另一个选项是将排序字段选择本身提取到一个单独的方法中,如下所示:
public IEnumerable<Data> SelectData(IEnumerable<Data> data, Func<Data, bool> predicate)
{
return data
.Where(predicate)
.OrderBy(GetCurrentOrderingField);
}
private IComparable GetCurrentOrderingField(Data x)
{
switch (OrderByColumn)
{
case "BookCategoryName":
return x.a.BookCategoryName;
case "BookCategoryDescription":
return x.a.BookCategoryDescription;
}
return x.a.CreatedOn;
}
public IEnumerable SelectData(IEnumerable数据,Func谓词)
{
返回数据
.Where(谓词)
.OrderBy(GetCurrentOrderingField);
}
私有IComparable GetCurrentOrderingField(数据x)
{
开关(OrderByColumn)
{
案例“BookCategoryName”:
返回x.a.BookCategoryName;
案例“图书类别说明”:
返回x.a.图书类别说明;
}
返回x.a.CreatedOn;
}
当然,对于实现IComparable接口的字段,另一个选项是将排序字段选择本身提取到一个单独的方法中,如下所示:
public IEnumerable<Data> SelectData(IEnumerable<Data> data, Func<Data, bool> predicate)
{
return data
.Where(predicate)
.OrderBy(GetCurrentOrderingField);
}
private IComparable GetCurrentOrderingField(Data x)
{
switch (OrderByColumn)
{
case "BookCategoryName":
return x.a.BookCategoryName;
case "BookCategoryDescription":
return x.a.BookCategoryDescription;
}
return x.a.CreatedOn;
}
public IEnumerable SelectData(IEnumerable数据,Func谓词)
{
返回数据
.Where(谓词)
.OrderBy(GetCurrentOrderingField);
}
私有IComparable GetCurrentOrderingField(数据x)
{
开关(OrderByColumn)
{
案例“BookCategoryName”:
返回x.a.BookCategoryName;
案例“图书类别说明”:
返回x.a.图书类别说明;
}
返回x.a.CreatedOn;
}
当然,这适用于实现IComparable接口的字段