2010-01-13 86 views
0

我只是用LINQ弄湿了自己的脚。给定三个项目列表,这是我想出来的只显示ClassB项目列表中引用的ClassA项目,但不在ClassC项目列表中。如何使用LINQ来过滤另一个列表中的项目列表,而不是第三个项目

var uniqueClassAIDsInClassB = 
    (from classB in classBList 
    select classB.ClassAID).Distinct(); 

var uniqueClassAIDsInClassC = 
    (from classC in classCList 
    select classC.ClassAID).Distinct(); 

var classAListFiltered = 
    from classA in GetClassAList() 
    where uniqueClassAIDsInClassB.Contains(classA.ID) 
      !uniqueClassAIDsInClassC.Contains(classA.ID) 
    select classA; 

所得列表被用作下拉列表数据源。什么是更清洁/更好的方式来做到这一点?

回答

3

这对我来说很好。我不知道你需要Distinct()调用。

你可以把它放到一个表达,但可能是不易阅读:

var classAListFiltered = from classA in GetClassAList() 
where (from classB in classBList select classB.ClassAID).Contains(classA.ID).... 

是有点难以阅读...

+0

+1不同的是不必要的,语句可以合并 – 2010-01-13 20:14:19

+0

哈 - 是啊,没有注意到含混的语句的冗余。感谢您的反馈! – jball 2010-01-13 20:49:43

+0

一些代码评论消除了可读性问题,现在对我来说这绝对看起来更清爽。再次感谢! – jball 2010-01-13 21:18:34

2

你的解决方案是好的。为了提高效率,您可能需要先创建一个A.ID列表。

var uniqueClassAIDsInClassA = 
    from id in uniqueClassAIDsInClassB 
    where !uniqueClassAIDsInClassC.Contains(id) 
    select id; 

var classAListFiltered = 
    from classA in GetClassAList() 
    where uniqueClassAIDsInClassA.Contains(classA.ID) 
    select classA; 
+0

有趣的 - 它似乎是一个比较轻量级的方式来比较三个列表,但它真的会提供一个显着的性能增益? – jball 2010-01-13 21:03:27

+0

性能增益取决于GetClassAList()的长度。 – Ray 2010-01-13 21:11:55

+0

目前这是大约1500项。这当然会随着时间而改变。 – jball 2010-01-13 21:30:48

相关问题