c# - LINQ 查询将列表中的几个项目变为选中状态

标签 c# .net linq

这是程序和评论。我有一个 ListA 和 ListB。如果 ListA 存在于 ListB 中,我想将其设为 IsChecked = true。这是程序:

public class SomeClass
{
    public bool IsChecked { get; set; }
    public string Title { get; set; }
}

List<SomeClass> ListA = new List<SomeClass>
{
    new SomeClass { IsChecked = false, Title = "A" },
    new SomeClass { IsChecked = false, Title = "B" },
    new SomeClass { IsChecked = false, Title = "C" },
    new SomeClass { IsChecked = false, Title = "D" },
    new SomeClass { IsChecked = false, Title = "E" },
    new SomeClass { IsChecked = false, Title = "F" },
};

List<SomeClass> ListB = new List<SomeClass>
{
    new SomeClass { Title = "A" },
    new SomeClass { Title = "D" },
    new SomeClass { Title = "F" },
};

// some linq query at the end of which listA's Item containing Title = "A","D","F" will become true

foreach (var item in ListA)
{
    Console.WriteLine(item.Title + " " + item.IsChecked); 
}
Console.ReadKey();

这是我想出的:

foreach (var item in ListB)
{
    var listAItem = (from itemA in ListA
                     where itemA.Title == item.Title
                     select itemA).First(); //no need for FirstOrDefault() because it is always going to be present

    listAItem.IsChecked = true;
}

但这看起来效率很低。使用 Linq 有更好的方法吗?我只想要 LINQ 中的解决方案。

最佳答案

你可以使用 Join像这样:

var itemAsToBeChecked = from itemA in ListA 
                        join itemB in ListB on itemA.Title equals itemB.Title 
                        select itemA;

foreach (var itemA in itemAsToBeChecked)
    itemA.IsChecked = true;

相信微软对 Join 的实现将首先从 Lookup<,> 创建一个查找 ( Title )至 SomeClassListB在枚举之前 ListA , 匹配每个 itemA随着查找的进行。这应该比您目前拥有的解决方案更有效。

您也可以考虑使用 HashSet<T> 如果您愿意:

var titlesToBeChecked = new HashSet<string>(ListB.Select(itemB => itemB.Title));
var itemAsToBeChecked = ListA.Where(itemA => titlesToBeChecked.Contains(itemA.Title));

foreach (var itemA in itemAsToBeChecked)
    itemA.IsChecked = true;

当然,在这里实现 IEqualityComparer<T> 可能是有意义的正如其他人提到的那样,在你的类型上,特别是如果 Title -based 相等性定义在您的程序中很常用。

关于c# - LINQ 查询将列表中的几个项目变为选中状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6883876/

相关文章:

c# - 如何设置备用 DNS 服务器?

.net - 如何在 C# 应用程序中访问二进制资源

c# - 使用 LINQ 将两个实体合二为一

c# - 如何检查xElement值是否存在?

c# - 将 EF LINQ 方法语法转换为查询语法

c# - "Data type mismatch in criteria expression"插入记录时

c# - 为什么将值存储在变量中会改变相等比较的结果?

c# - 如何设置另一个应用程序焦点并使其成为事件窗口

c# - DbContext 没有编译?

android - 在 android GCM 中获取相同的消息