这是该计划以及评论.我有一个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中使用该解决方案.
你可以使用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<,>从)Title到SomeClass上ListB列举之前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你的程序中经常使用基于等式的相等定义.
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |