簡體   English   中英

如何在lambda表達式中返回不同的DataType?

[英]How can I return different DataTypes in lambda expression?

我想獲得以下功能。 但是由於我必須返回不同的數據類型,因此不允許使用該方法。 在這種情況下我該怎么辦?

.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可能返回的每種數據類型,請使用單獨的塊定義順序,對於不使用該返回類型的所有選項,請返回一個常量。

暫時猜測, CreatedOn是一個DateTimeBookCategoryNameBookCategoryDescription是字符串,它類似於:

.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接口的字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM