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

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.这违背了业务逻辑,因此单元测试负责这一点.

Ant*_*ram 7

我只想要匹配的第一个项目,因为我不希望得到多个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进行比较.


Bal*_*a R 5

var key = MyDictionary.First(kvp => kvp.Value.Prop1 == theString).Key;
Run Code Online (Sandbox Code Playgroud)