在具有复杂谓词的自定义对象列表上使用“查找”

时间:2015-11-04 14:54:03

标签: c# list

这可能不是正确的方法,但是这里......

我有一个'规则列表'我在XML中定义了......

Rule found = rules.Find(x => (x.key1 == "2") && (x.key2 == "John"));

我试图想出一种新的规则'可以在重新编译和测试程序之外定义和使用。

因此程序将XML反序列化为自定义对象列表(List)。到目前为止没问题。

现在,我想使用Find来做类似......(C#)

的事情
{{1}}

...从上面返回第二条规则,因此我正在寻找" Blue"。

这甚至可能还是我离开基地了?

1 个答案:

答案 0 :(得分:2)

您应该使用SingleOrDefault

Rule found = rules.SingleOrDefault(r => r.key1 == "2" && r.key2 == "John");

引用MSDN:

  

返回序列的唯一元素,如果序列为空,则返回默认值;如果序列中有多个元素,则此方法抛出异常。

请注意,如果找不到满足给定表达式的元素,found将为null

此外,如果列表中的多个元素满足条件,它将抛出InvalidOperationException

我认为这是预期的,因为您正在基于每个规则的唯一键进行搜索。如果有两个具有相同键的规则,则应引发异常。

如果您期望正好一个元素(并且如果找到更多或没有,则抛出异常),您应该使用Single

Rule found = rules.Single(r => r.key1 == "2" && r.key2 == "John");
  

返回序列的唯一元素,如果序列中没有一个元素,则抛出异常。