如何将这些foreach循环转换为LINQ表达式
本文关键字:转换 LINQ 表达式 循环 foreach | 更新日期: 2023-09-27 18:27:53
我使用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[]
-值包含给定值的第一个键?
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"
-默认值:
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
}