繁体   English   中英

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

[英]How could I convert these foreach loops into a LINQ-expression?

我使用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";

循环基本上检查字典的值(字符串数组),以查看targetValue属于其中的任何一个,如果在内部找到,则返回该数组的键。

我尝试执行以下操作,但是很明显,如果它的值等于targetValue ,它只会返回内部的值。

var r = dictionary
        .SelectMany(t => t.Value)
        .FirstOrDefault(t => t == targetValue);

因此,您想获取字典中的第一个键,其中string[] -value包含给定值?

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;
}

最后但并非最不重要的另一种方法是我的最爱,它也使用"User" -default:

string group = dictionary.Where(kv => kv.Value.Contains(myValue))
    .Select(kv=> kv.Key)
    .DefaultIfEmpty("User")
    .First();
var r = dictionary.FirstOrDefault( x => x.Value.FirstOrDefault(y => y == myValue) != null);

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

编辑:

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM