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仅在调用OptionTextDoesMatch与SomeID该的savedOption是在列表中找到SomeID的itemOptions.如果在集合中找到OptionTextDoesMatch返回trueAND和当前的调用,那么它将在savedOptions SavedOption.SomeIDitemOptionToList()
更新:
我试过这个,但语法仍然不适合我:
savedOptions.Where(itemOptions.Any(OptionTextDoesMatch(x,y)&&(y => y.SomeID == x.SomeID))).ToList();
现在我不知道我是否可以像这样投入x.我假设如果我这样做将代表currrent savedOption而我不需要=>?
虽然上面的答案是正确的,但它们是"给人一条鱼"的答案.最好借此机会学习如何将问题分解成小块,然后将结果重新组合成查询.
在上面,我需要/想要做的是只有在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)
明白了吗?
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |