这是程序和评论。我有一个 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
)至 SomeClass
在 ListB
在枚举之前 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/