C# 如何将这些foreach循环转换为LINQ表达式?

C# 如何将这些foreach循环转换为LINQ表达式?,c#,linq,C#,Linq,我使用ReSharper检查项目中的代码问题,它通知我以下循环可以转换为LINQ表达式: var dictionary = new Dictionary<string, string[]> { { "400", new[] { "12345", "54321", "51423" } }, { "500", new[] { "67890", "09876", "63727" } }, { "600", new[] { "41713", "98234", "965

我使用ReSharper检查项目中的代码问题,它通知我以下循环可以转换为LINQ表达式:

var dictionary = new Dictionary<string, string[]>
{
    { "400", new[] { "12345", "54321", "51423" } },
    { "500", new[] { "67890", "09876", "63727" } },
    { "600", new[] { "41713", "98234", "96547" } },
    { "700", new[] { "00000", "67990", "83752" } }
};

// ...

var targetValue = "41713";
foreach (string group in dictionary.Keys)
{
    foreach (string name in dictionary[group])
    {
        if (name == targetValue)
            return group;
    }
}
return "User";
var r=dictionary.FirstOrDefault x=>x.Value.FirstOrDefaulty=>y==myValue!=无效的 var r=dictionary.FirstOrDefault x=>x.Value.FirstOrDefaulty=>y==myValue!=无效的
那么您想获取字典中的第一个键,哪个字符串[]-值包含给定的值

var pairs = dictionary.Where(kv => kv.Value.Contains(myValue));
if (pairs.Any())
{
    string group = pairs.First().Key;
}
或者可读性较低,但效率较高,因为它只执行一次查询:

var pair = dictionary.FirstOrDefault(kv => kv.Value.Contains(myValue));
if (!pair.Equals(default(KeyValuePair<string, string[]>)))
{
    string group = pair.Key;
}

那么您想获取字典中的第一个键,哪个字符串[]-值包含给定的值

var pairs = dictionary.Where(kv => kv.Value.Contains(myValue));
if (pairs.Any())
{
    string group = pairs.First().Key;
}
或者可读性较低,但效率较高,因为它只执行一次查询:

var pair = dictionary.FirstOrDefault(kv => kv.Value.Contains(myValue));
if (!pair.Equals(default(KeyValuePair<string, string[]>)))
{
    string group = pair.Key;
}

这还将返回所需的值,如果该值不存在,则返回null:

编辑:


这还将返回所需的值,如果该值不存在,则返回null:

编辑:


@TimSchmelter我的坏,不小心写了dictionary而不是dictionary.keys如果ReSharper通知您循环可以转换为LINQ,它也可以为您转换。@svick我明白了,我以前没有注意到!不幸的是,ReSharper只转换了内部foreach。@TimSchmelter我的坏,不小心写了dictionary而不是dictionary.keys如果ReSharper通知您循环可以转换为LINQ,它也可以为您转换。@s我明白了,我以前没有注意到!不幸的是,ReSharper只转换了内部foreach。非常感谢,我使用了第二个。过一会儿我将用我的最终代码更新我的问题。@GrawCube:我添加了另一种方法,这是我最喜欢的方法。它还考虑了你的用户需求。当运行1000000次时,最后一个似乎比另外两个59毫秒比85毫秒和95毫秒略快。我要换那个!非常感谢,我用了第二个。过一会儿我将用我的最终代码更新我的问题。@GrawCube:我添加了另一种方法,这是我最喜欢的方法。它还考虑了你的用户需求。当运行1000000次时,最后一个似乎比另外两个59毫秒比85毫秒和95毫秒略快。我要换那个!他想要字典的钥匙。如果你把它扔掉,现在只拥有和他已经拥有的价值相同的价值,那是很困难的。他想要字典的钥匙。如果你把它扔掉,只拥有现在的价值,这是很困难的,因为他已经拥有了同样的价值。
var result = dictionary.SkipWhile(n => !n.Value.Contains(myValue)).FirstOrDefault().Key;
//another way to get the key
//var result = dictionary.SingleOrDefault(n => n.Value.Contains(myValue)).Key;
if (result != null)
{
   //do whatever with the result variable here
}