mic*_*ael 2 c# linq foreach dictionary key-value
我有一个IDictionary
我需要选择Bar.Prop1与字符串值匹配的第一个Foo.
public class Foo { }
public class Bar
{
public String Prop1 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我有这样的...
foreach (var kvp in MyDictionary)
{
if (kvp.Value.Prop1 == theString)
{
var key = kvp.Key;
//Do something with it
break;
}
}
Run Code Online (Sandbox Code Playgroud)
但这似乎并不像LINQ Query那样干净.ReSharper把它变成了:
foreach (var kvp in MyDictionary.Where(kvp => kvp.Value.Prop1 == theString))
{
var key = kvp.Key;
//Do something with it
//break; is unnecessary because I only get one kvp back anyways.
}
Run Code Online (Sandbox Code Playgroud)
我只想要匹配的第一个项目,因为我不希望得到多个KVP.这违背了业务逻辑,因此单元测试负责这一点.
我只想要匹配的第一个项目,因为我不希望得到多个KVP.这违背了业务逻辑,因此单元测试负责这一点.
如果是这种情况,我认为你需要使用更强的代码保证你的意图,这将是Single
(或SingleOrDefault
)方法.First
将返回与给定谓词匹配的任意多个第一个对象.如果许多违背您的期望和业务规则,这似乎是一个错误.这样对待它.
var key = MyDictionary.Single(pair => pair.Value.Prop1 == someValue).Key;
Run Code Online (Sandbox Code Playgroud)
使用Single
,如果序列中有多个匹配项,则会导致异常.
SingleOrDefault
允许0或1,但永远不会更多.如果使用这种方法,您需要捕获结果并在执行其他操作(触发方法,访问属性等)之前与null进行比较.
var key = MyDictionary.First(kvp => kvp.Value.Prop1 == theString).Key;
Run Code Online (Sandbox Code Playgroud)