這是程序以及註釋。我有一個ListA和ListB。如果它出現在ListB中,我想將ListA的IsChecked = true。這是程序:LINQ查詢將列表中的少數項目選中爲
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中的解決方案。提前:)
+1。我喜歡你的解決方案。 BrokenGlass提供的Intersect解決方案如何?這是否也會創建一個查詢?任何想法? – TCM
@Anthony:如果你的類型有適當的等式實現,或者你提供了一個合適的'IEqualityComparer','Intersect'就可以正常工作。但我並不喜歡在這裏交叉,因爲這會讓讀者感到困惑。當每個列表中的匹配項目在各種可能的意義上都「相等」時,通常使用「相交」。但是你非常關心結果應該來自哪個列表......(不是說這個方法的文檔是模糊的,但是它會很奇怪)。 – Ani