我将使用一些基本的精简示例来说明我的问题。
我有一个类:
class Item
{
int ID;
bool Selected;
}
现在假设我有两个列表 Item
类:
List<Item> ListA = GetListA();
List<Item> ListB = GetListB();
现在我想创建第三个列表,其中包含 ListB
中的所有项目.重要的是,如果在 ID
中找到匹配项(相同的 ListA
)那我想用那个 Selected
值,否则我想保留 Selected
ListB
中项目的值.
我正在创建第三个列表,如下所示:
List<Item> ListC = from item in ListB
select new Item
{
ID = item.ID,
Selected = item.Selected// <-- should use value form ListA if available
};
重要:我不想显得无知,但我不想想改变方式ListC
被 build 。我的意思是我想使用“linq select”方法,并且我想使用分配 Selected
的“one liner”值...我知道还有其他方法可以创建列表,但我不会学到任何新东西。
到目前为止我已经尝试了一些事情......
我知道这行得通,但我不想查询 ListA
两次:
Selected = ListA.Any(x => x.ID == item.ID) ? ListA.First(x => x.ID == item.ID).Selected : item.Selected
我也尝试使用 DeafultIfEmpty
但我认为对于这种情况这不是正确的想法...因为它没有用,而且如果 ListA
似乎更有用。是空的(我不关心)
最佳答案
您可以按如下方式修改最后一行代码:
Selected = (ListA.FirstOrDefault(x => x.ID == item.ID) ?? item).Selected;
对于DefaultIfEmpty
,你必须做
Selected = ListA.Where(x => x.ID == item.ID).DefaultIfEmpty(item)
.First().Selected;
这更难理解,但本质上是一样的。
正如 Dominic 在下面指出的,如果您使用 SingleOrDefault/Single
代替 FirstOrDefault/First
,如果您在 中找到两个项目,您将得到一个异常具有相同
- 这可能是您要引入的检查。ID
的 ListA
(有更好/更有效的方法来做到这一点,但正如您所说,您想修复这种的方法,而不是使用完全不同的方法.)
关于c# - Linq 选择 : Using a value from a list if available,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13624161/