C# Where子句并向自定义方法发送2个不匹配的参数

C# Where子句并向自定义方法发送2个不匹配的参数,c#,linq,C#,Linq,好的,我正在努力让它工作。这是我第一次使用LINQ。到目前为止,除了我一直想弄清楚的一个小问题外,一切都很好 场景:我将向一个方法发送两个通用列表。该方法在下面给出了一个列表,其中只包含在这两个对象中都找到某个ID的对象(union)。列表可以有不同的长度和ID的不同顺序。我的目标或者说我想做的是从比较这两个列表中恢复过来,这两个列表都有相同的ID但是此外,当我在这两个列表中找到一个匹配的对象时(通过id),除非对optionMatch的调用也是真的(这就是为什么我有&&),否则不要将该对象返回

好的,我正在努力让它工作。这是我第一次使用LINQ。到目前为止,除了我一直想弄清楚的一个小问题外,一切都很好

场景:我将向一个方法发送两个通用列表。该方法在下面给出了一个列表,其中只包含在这两个对象中都找到某个ID的对象(union)。列表可以有不同的长度和ID的不同顺序。我的目标或者说我想做的是从比较这两个列表中恢复过来,这两个列表都有相同的ID但是此外,当我在这两个列表中找到一个匹配的对象时(通过id),除非对optionMatch的调用也是真的(这就是为什么我有&&),否则不要将该对象返回给我

我遇到的主要问题是,列表的长度可能完全不同,甚至ID列表中也存在差异。但我们知道,我们传递给我的方法的所有列表都有一些共同点,其中一些对象将通过ID匹配…无论我们比较的两个列表的长度或顺序是什么…我们希望列表的并集恢复,但前提是对匹配的ID集的optionMatch的调用也匹配

这是我的LINQ声明(原件)

List finalItemOptions=savedItemMoptions.Where(y=>itemOptions.All(x=>OptionsMatch(x,y)和&(y.actID==x.Id)).ToList();
我最近将其更改为:

List finalItemOptions=savedItemOptions.Where(y=>(y.actID==x.Id)和&itemOptions.All(x=>OptionsMatch(x,y)).ToList()


但问题是,LINQ将y中的第一个Id与x中的其他Id进行比较。太好了。采取第一个y.actID并查看x的所有x.ID。但后来它停止了。然后,它不会移动到下一个savedItemOptions索引并再次将y.actID与x的所有x.id进行比较。

这非常简单-只需更改表达式中的顺序:

List<SavedItemOption> finalItemOptions = savedItemOptions
    .Where(y => itemOptions.Any(x => y.actID == x.Id && OptionsMatch(x,y)))
    .ToList();

还是不行。它在两个列表之间以向前的方式移动,因此第一次,IDs jsut碰巧匹配,很幸运,它们是两个列表中的第一个。但是,一旦它迭代并检查了列表中的第二组ID,这些ID就不同了,所以它永远不会出现在我的MatchOptions方法中。@coffeeaddict:恐怕我不能真正理解您看到的情况。如果你能包含一个简短但完整的程序来重现这个问题,那就简单多了。我给出的代码只会为具有相同ID的项调用OptionsMatch,如果这些项存在,应该会找到它们……您展示的使用连接的第二种方法非常有效。不知道为什么我们不能让第一个也这么做。奇怪。问题是:List finalItemOptions=savedItemOptions.Where(y=>(y.actID==x.Id)和&itemOptions.All(x=>OptionsMatch(x,y))).ToList();当我调试时,在列表的第二次迭代中,无序列表中的第二个ID是不一样的,因此它不会在LINQ迭代的第二次中碰到我的OptionMatch方法。它发现itemOptions[1]中的ID与savedItemOptions[1]中的ID不同,因此跳过选项Match Method请编辑您的问题,而不是添加注释。。。并添加一些示例数据。从你所说的,我想你会希望它跳过选项匹配不同ID的配对。。。
List<SavedItemOption> finalItemOptions = savedItemOptions
    .Where(y => itemOptions.Any(x => y.actID == x.Id && OptionsMatch(x,y)))
    .ToList();
var finalItemOptions = (from y in savedItemOptions
                        join x in itemOptions on y.actID equals x.Id
                        where OptionsMatch(x, y)
                        select y).ToList();