c# - Linq 选择 : Using a value from a list if available

标签 c# linq

我将使用一些基本的精简示例来说明我的问题。

我有一个类:

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/

相关文章:

c# - 确保变量初始化 C#

c# - 在 winforms 应用程序中,如何从必须始终位于前台的后台工作人员运行消息框?

c# - 如何在不加载整行的情况下更新 LINQ 中的单个列?

c# - EF - LINQ to Entities 不支持

c# - 在Graphics.Drawing中使用未分配的局部变量

c# - MemoryStream 是否在构建时复制?

c# - 有没有办法在 WCF 中实现核心代码模板?

c# - 如何筛选具有日期的列表并仅检索 7 天内的数据

linq - ".OrderBy(p => p.Id)"和 "orderby p.Id ascending"之间的区别

c# - 在 C# 中的 Linq 语句中使用 Take 时如何返回全部