LINQ查询将列表中的少数项目视为已选中

TCM*_*TCM 3 .net c# linq

这是该计划以及评论.我有一个ListA和ListB.我想将ListA的IsChecked = true,如果它存在于ListB中.这是该计划:

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();
Run Code Online (Sandbox Code Playgroud)

这就是我想出的:

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;
}
Run Code Online (Sandbox Code Playgroud)

但这看起来非常低效.使用Linq有没有更好的方法呢?我只想在LINQ中使用该解决方案.

Ani*_*Ani 5

你可以使用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;
Run Code Online (Sandbox Code Playgroud)

相信微软的落实Join将首先创建一个查询(Lookup<,>从)TitleSomeClassListB列举之前ListA,每个匹配itemA与查找,因为它去.这应该比您目前的解决方案更有效.

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

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;
Run Code Online (Sandbox Code Playgroud)

当然,IEqualityComparer<T>像其他人提到的那样在这里实现你的类型可能是有意义的,特别是如果Title你的程序中经常使用基于等式的相等定义.