如何在 lambda 表达式中返回不同的数据类型

本文关键字:数据类型 返回 lambda 表达式 | 更新日期: 2023-09-27 18:36:18

我想获得以下功能。但是由于我必须返回不同的数据类型,因此不允许使用该方法。在这种情况下,我将如何操作?

.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 表达式中返回不同的数据类型

我建议您更改逻辑以构建查询,而不是在lambda中创建这样的逻辑:

在构建查询之前,例如:

var query = list.Where(...);
if(OrderByColumn=="BookCategoryName")
{
   query = query.OrderBy(x=>x.a.BookCategoryName);
}
....

最后:

var result = query.ToList(); //for e.g.

它会随心所欲地工作,看起来更干净

对于当前 lambda 可能返回的每种数据类型,请使用单独的块来定义排序,对于不使用该返回类型的任何选项,返回一个常量。

目前猜测CreatedOnDateTimeBookCategoryNameBookCategoryDescription是字符串,它会是这样的:

.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;
}

当然,这对于实现 IComparable 接口的字段。