如何在LINQ中执行2次检查

Pos*_*Guy 1 c# linq c#-3.0

public List<SavedOption> GetValidSavedOptions(
    List<Option> itemOptions, 
    List<SavedOption> savedOptions)
{
    List<SavedOption> finalSavedOptions = savedOptions.Where(x => 
        OptionTextDoesMatch(y, x) && 
        itemOptions.Any(y => y.SomeID == x.SomeID)
    ).ToList(); 
}
Run Code Online (Sandbox Code Playgroud)

我对LINQ和Lambdas完全不熟悉.

在上面的,我需要/想要做的是包括SavedOption仅在调用OptionTextDoesMatchSomeID该的savedOption是在列表中找到SomeIDitemOptions.如果在集合中找到OptionTextDoesMatch返回trueAND和当前的调用,那么它将在savedOptions SavedOption.SomeIDitemOptionToList()

更新:

我试过这个,但语法仍然不适合我:

savedOptions.Where(itemOptions.Any(OptionTextDoesMatch(x,y)&&(y => y.SomeID == x.SomeID))).ToList();

现在我不知道我是否可以像这样投入x.我假设如果我这样做将代表currrent savedOption而我不需要=>?

Eri*_*ert 6

虽然上面的答案是正确的,但它们是"给人一条鱼"的答案.最好借此机会学习如何将问题分解成小块,然后将结果重新组合成查询.

在上面,我需要/想要做的是只有在itemOptions的SomeID列表中找到对SelectedText的OptionTextDoesMatch和SomeID的调用时才包含SavedOption.

让我试着改写这个令人困惑的句子.

您有一个SavedOptions列表.每个SavedOption都有一个ID和一些文本.

您有一个选项列表.每个选项都有一个ID和一些文本.

您希望过滤SavedOptions列表,以获取与BOTH文本和ID上的某些选项匹配的SavedOptions.

打破问题.假设您没有SavedOptions序列.假设您只有一个SavedOption和一个Options列表.你怎么知道它是不匹配的?

这很简单:

SavedOption mySavedOption = whatever;
bool matchExists = itemOptions.Any(item=>
    OptionTextDoesMatch(item, mySavedOption) && 
    item.SomeID == mySavedOption.SomeID);
Run Code Online (Sandbox Code Playgroud)

那有意义吗?

现在假设你想从一个带有SavedOption 的谓词中做出一个谓词.你会怎么做?这很简单:

Func<SavedOption, bool> predicate = savedOption => 
    itemOptions.Any(item=>
        OptionTextDoesMatch(item, savedOption ) && 
        item.SomeID == savedOption.SomeID);
Run Code Online (Sandbox Code Playgroud)

这是一个判断单个项是否匹配的谓词.

还有意义吗?如果有些事情让人困惑,请阻止我.

因此,要从中删除它,请将谓词应用于已保存选项列表中的每个项目:

result = savedOptions.Where(savedOption => 
    itemOptions.Any(item=>
        OptionTextDoesMatch(item, savedOption) && 
        item.SomeID == savedOption.SomeID));
Run Code Online (Sandbox Code Playgroud)

或者,在查询理解表单中,我个人觉得更容易阅读.

result = from savedOption in savedOptions
         where itemOptions.Any(item =>
             OptionTextDoesMatch(item, savedOption) && 
             item.SomeID == savedOption.SomeID)
         select savedOption;
Run Code Online (Sandbox Code Playgroud)

但是可能更好的选择是使用连接. 连接只是对两个与id相关的集合的笛卡尔积的过滤器进行优化.

result = from savedOption in savedOptions
         join itemOption in itemOptions 
         on savedOption.SomeID equals itemOption.SomeID
         where OptionTextDoesMatch(itemOption, savedOption)
         select savedOption;
Run Code Online (Sandbox Code Playgroud)

明白了吗?