我的一个方法中有以下代码:
foreach (var s in vars) { foreach (var type in statusList) { if (type.Id == s) { Add(new NameValuePair(type.Id, type.Text)); break; } } }
这似乎对我来说无效,我想知道是否有办法用LINQ查询替换至少一个foreach.有什么建议?
编辑: vars是一个字符串数组,Add方法将一个项添加到CSLA NameValueList.
基本上:
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)
编辑:我没有受人注目的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); }
你可能想要制作一个AddRange
方法来获取IEnumerable
你可以调用的点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)); } }
这样做的好处是,它基本上只通过一次类型列表来构建字典.