我的一个方法中有以下代码:
foreach (var s in vars)
{
foreach (var type in statusList)
{
if (type.Id == s)
{
Add(new NameValuePair(type.Id, type.Text));
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎对我来说无效,我想知道是否有办法用LINQ查询替换至少一个foreach.有什么建议?
编辑: vars是一个字符串数组,Add方法将一个项添加到CSLA NameValueList.
Kei*_*ith 12
基本上:
var types =
from s in vars
let type = (
from tp in statusList
where tp.Id == s ).FirstOrDefault()
where type != null
select new NameValuePair(type.Id, type.Text)
Run Code Online (Sandbox Code Playgroud)
编辑:我没有受人注目的break;前
如果可能有多个具有相关ID的类型,那么您需要FirstOrDefault根据Keith的答案或下面的第二个代码示例使用.
编辑:删除"多个"版本,因为它是不必要的低效率假设相等/哈希码适用于任何类型的type.Id.
但是,连接可能更合适:
var query = from s in vars
join type in statusList on s equals type.Id
select new NameValuePair(type.Id, type.Text);
foreach (var pair in query)
{
Add(pair);
}
Run Code Online (Sandbox Code Playgroud)
你可能想要制作一个AddRange方法来获取IEnumerable<NameValuePair>你可以调用的点AddRange(query).
或者,您可以使用LookUp.此版本确保每个"s"只添加一种类型.
var lookup = types.ToLookup(type => type.Id);
foreach (var s in vars)
{
var types = lookup[s];
if (types != null)
{
var type = types.First(); // Guaranteed to be at least one entry
Add(new NameValuePair(type.Id, type.Text));
}
}
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,它基本上只通过一次类型列表来构建字典.
| 归档时间: |
|
| 查看次数: |
24263 次 |
| 最近记录: |