gpt4 book ai didi

c# - LINQ 中的条件选择(如果为空,则改为选择)

转载 作者:太空狗 更新时间:2023-10-29 21:59:01 25 4
gpt4 key购买 nike

是否有一些“LINQ”方法可以有条件地选择数据,即如果第一个数据源为空,则从另一个数据源中选择?一个例子是,如果你有一个项目的树结构,你想从根中获取一些 Assets ,或者如果它是空的,从它的 child 中获取一些 Assets 。

我有以下示例:

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

但这将包括在子项的 Assets 的 Items 集合中找到的 Assets

关于c# - LINQ 中的条件选择(如果为空,则改为选择),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9989679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com