簡體   English   中英

LINQ中的條件選擇(如果為空則選擇)

[英]Conditional selection in LINQ (select instead if empty)

是否有一些“LINQ”方式來條件選擇數據,即如果第一個數據為空則從另一個來源中選擇? 一個例子是,如果你有一個項目的樹結構,你想從一個根,或者如果它是空的,從它的孩子那里得到一些資產。

我有以下示例:

IEnumerable<Item> items = ...;
// Item has a Assets property that returns IEnumerable<Asset>
// Item has a SubItems property that returns IEnumerable<Item>
//    i.e. other items with assets in them

// getting assets from a "main" item
var assets = item.Assets.Where(a => HasRelevantAsset(a));

// if there were no relevant assets in the "main" item
if (!assets.Any()) {
    // then reselect from "subitems" assets instead
    assets = item.SubItems.SelectMany(item => 
        item.Assets.Where(a => HasRelevantAsset(a)));
}

// HasRelevantAsset(Asset) is a static method that returns 
// true if it is the asset that is needed

我相信LINQ方式看起來有點難看

var assets = item.Any(a=>HaRelevantAsset(a)) ? item.Where(a => HasRelevantAsset(a)) :
                     item.SubItems.SelectMany(item => 
                            item.Assets.Where(a => HasRelevantAsset(a)));

我會選擇其他變種,擴展方法

public static IEnumerable<Asset> SelectRelevantAssets(this Item item)
{
     var assetsInItemFound = false;
     foreach (var asset in item.Assets)
     {
         if (HasRelevantAsset(asset))
         {
             assetsInItemFound = true;
             yield return asset;
         }
     }
     if (assetsInItemFound)
     {
         yield break;
     }
     else
     {
         foreach (var subItem in item.SubItems)         
             foreach (var asset in subItem.Assets)
                if (HasRelevantAsset(asset))
                    yield return asset;
     }
}





首先,我想嘗試對SelectRelevantAssets進行遞歸調用,我想是這樣的

if (!assetsInItemFound)
         {
             yield break;
         }
         else
         {
             foreach (var subItem in item.SubItems)         
                 foreach (var asset in SelectRelevantAssets(subItem))
                        yield return asset;
         }

但這將包括在subItem的Items集合中找到的資產

暫無
暫無

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

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