LINQ查询-根据具有与字符串匹配的属性的值选择键?

| 我有一个词典 我需要选择Bar.Prop1匹配字符串值的第一个Foo。
public class Foo { }

public class Bar
{
    public String Prop1 { get; set; }
}
现在我就这样...
foreach (var kvp in MyDictionary)
{
    if (kvp.Value.Prop1 == theString)
    {
        var key = kvp.Key;
        //Do something with it
        break;
    }
}
但这似乎不像LINQ查询那样干净。 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.
}
我只想要第一个匹配的项目,因为我从不希望获得超过一个KVP。这与业务逻辑背道而驰,因此单元测试可以解决这一问题。     
已邀请:
           我只想要第一个   匹配,因为我从未期望过   获得不止一个KVP。那   违反业务逻辑,所以   单元测试可以解决这一问题。 如果是这种情况,我认为您需要针对您的意图使用更强大的代码保证,那就是
Single
(或
SingleOrDefault
)方法。
First
将返回与给定谓词匹配的任意多个第一个对象。如果许多违反您的期望和业务规则,这似乎是一个错误。这样对待它。
var key = MyDictionary.Single(pair => pair.Value.Prop1 == someValue).Key;
对于
Single
,如果一个序列中有多个匹配项,将导致异常。
SingleOrDefault
允许0或1,但不能超过1。如果使用这种方法,则需要捕获结果并将其与null进行比较,然后再执行其他操作(触发方法,访问属性等)。     
        
var key = MyDictionary.First(kvp => kvp.Value.Prop1 == theString).Key;
    
        @Bala R \的答案是正确的,但安东尼·佩格拉姆(Anthony Pegram)在对OP的评论中提出了非常好的观点。如果使用不同的键多次执行此操作,则应该改写字典,这样就不必每次想要一个值时都遍历整个集合。
// Do this just once: it\'s expensive
var reverseDict = MyDictionary.ToDictionary(kvp => kvp.Value.Prop1, kvp => kvp.Key);

...
// Do this as many times as you need: it\'s cheap
var key = reverseDict[someValue];
    

要回复问题请先登录注册