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

问题描述 投票:2回答:1

我有一个代码:

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(); 

我是C#的新手,从Java转而来。在java中,它很容易就像这样:

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

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

c# linq
1个回答
11
投票

首先,如果您经常这样做,您可能需要考虑替代数据结构。字典并非真正用于频繁“基于价值的某些方面进行查找”。

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

var key = StatusMapping.First(x => x.Value.Contains(status)).Key;

如果没有任何比赛,First()将抛出异常。

如果您希望最终使用默认值,则可以使用:

var key = StatusMapping.FirstOrDefault(x => x.Value.Contains(status)).Key;

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

请注意,这仅与此完全相同,因为KeyValuePair<,>是值类型,因此默认值为非null,具有默认键。如果您有一系列引用类型,则需要以下内容:

var property = sequence.FirstOrDefault(whatever)?.Property;

...其中?.是空条件运算符。

© www.soinside.com 2019 - 2024. All rights reserved.