如何使用LINQ在Dictionary中查找元素

Kir*_*rov 2 c# linq

我有一个代码:

var status = ...
var StatusMapping = new Dictionary<AnotherStatus, IList<Status>>
{
    {
        AnotherStatus,
        new List<Status>
        {
            Status1,
            Status2
        }
    }
}

foreach (var keyValuePair in StatusMapping)
{
    if (keyValuePair.Value.Contains(status))
    {
        return keyValuePair.Key;
    }
}

throw Exception(); 
Run Code Online (Sandbox Code Playgroud)

我是C#的新手,从Java切换到了C#。在Java中,可以很容易地做到这一点:

return StatusMapping
    .entrySet()
    .stream()
    .filter(e -> e.getValue().contains(status))
    .map(Map.Entry::getKey)
    .findFirst()
    .orElseThrow(() -> new Exception());
Run Code Online (Sandbox Code Playgroud)

有没有办法用LINQ做到这一点?

Jon*_*eet 11

首先,如果您定期执行此操作,则可能需要考虑其他数据结构。字典并不是真正用于频繁的“基于值的某些方面的查找”。

哦,这在C#中相当简单:)

var key = StatusMapping.First(x => x.Value.Contains(status)).Key;
Run Code Online (Sandbox Code Playgroud)

First() 如果没有匹配项,将抛出异常。

如果要使用默认值代替,可以使用:

var key = StatusMapping.FirstOrDefault(x => x.Value.Contains(status)).Key;
Run Code Online (Sandbox Code Playgroud)

这将key成为AnotherStatus(或任何键类型)的默认值。

请注意,这只是完全像这样工作,因为它KeyValuePair<,>是一个值类型,因此默认值是非null,带有默认键。如果您有一系列引用类型,则需要类似以下内容:

var property = sequence.FirstOrDefault(whatever)?.Property;
Run Code Online (Sandbox Code Playgroud)

...这里?.是空条件运算符。