好的,我正试图让这个工作。这是我第一次使用LINQ。到目前为止,除了我一直想弄清楚的一点点障碍之外,它还可以。
场景:我有2个通用列表,我正在发送给方法。这个方法在下面有这个给我一个仅列出那些在两者中找到某个ID的对象(union)的列表。列表可以具有不同的长度和不同的ID顺序。目标或我想要做的是从比较这两个列表,两个具有相同ID的对象列表中回来。 但是此外,当我在这两个列表中找到匹配的对象时(通过id),除非对OptionsMatch的调用也是真的,否则不要回复该对象(这就是为什么我有&& ;)
我遇到的主要问题是列表的长度可能完全不同,并且在ID列表中甚至存在差异。但是我们知道我们传递给我的方法的所有列表都会有一些共同点,其中一些对象会被ID匹配...无论我们比较的2个列表是什么长度或者是...我们想要的返回列表的联合,但前提是对匹配的ID集合的OptionsMatch调用也匹配。
这是我的LINQ声明(原创)
List<SavedItemOption> finalItemOptions = savedItemOptions.Where(y => itemOptions.All(x => OptionsMatch(x,y) && (y.actID == x.Id))).ToList();
我最近将其更改为:
列出finalItemOptions = savedItemOptions.Where(y =&gt;(y.actID == x.Id)&amp;&amp; itemOptions.All(x =&gt; OptionsMatch(x,y)))。ToList(); < / p>
但问题是,LINQ正在将y中的第一个Id与x中的每个其他id进行比较。那很棒。获取第一个y.actID并查看x的所有x.ID.但随后就停止了。然后它不会移动到下一个savedItemOptions索引,并再次将y.actID与x的所有x.ID进行比较。
答案 0 :(得分:1)
这很简单 - 只需更改表达式中的顺序:
List<SavedItemOption> finalItemOptions = savedItemOptions
.Where(y => itemOptions.Any(x => y.actID == x.Id && OptionsMatch(x,y)))
.ToList();
这取决于C#对&amp;&amp; amp;的短路。 operator - 如果LHS返回false,则不评估RHS。
另一个选择是使用联接:
var finalItemOptions = (from y in savedItemOptions
join x in itemOptions on y.actID equals x.Id
where OptionsMatch(x, y)
select y).ToList();