我有一个代码:
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#中相当简单:)
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;
...其中?.
是空条件运算符。