Spo*_*ike 6 c# linq linq-to-objects
是否有一些"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
Run Code Online (Sandbox Code Playgroud)
我相信LINQ方式会看起来有点难看
var assets = item.Any(a=>HaRelevantAsset(a)) ? item.Where(a => HasRelevantAsset(a)) :
item.SubItems.SelectMany(item =>
item.Assets.Where(a => HasRelevantAsset(a)));
Run Code Online (Sandbox Code Playgroud)
我会选择其他变体,扩展方法
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;
}
}
Run Code Online (Sandbox Code Playgroud)
首先我想尝试递归调用 SelectRelevantAssets,我想就像
if (!assetsInItemFound)
{
yield break;
}
else
{
foreach (var subItem in item.SubItems)
foreach (var asset in SelectRelevantAssets(subItem))
yield return asset;
}
Run Code Online (Sandbox Code Playgroud)
但这将包括在子项目的资产的 Items 集合中找到的资产
| 归档时间: |
|
| 查看次数: |
1194 次 |
| 最近记录: |