加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 用LINQ查询替换foreach

发布时间:2020-12-15 20:04:21 所属栏目:百科 来源:网络整理
导读:我的一个方法中有以下代码: foreach (var s in vars){ foreach (var type in statusList) { if (type.Id == s) { Add(new NameValuePair(type.Id,type.Text)); break; } }} 这似乎对我来说无效,我想知道是否有办法用LINQ查询替换至少一个foreach.有什么建议
我的一个方法中有以下代码:

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.

解决方法

编辑:我没有注意到休息;之前

如果可能有多个具有相关ID的类型,则需要按照Keith’s answer或我的第二个代码示例使用FirstOrDefault.

编辑:删除“多个”版本,因为它不必要地低效,假设相等/哈希码适用于任何类型的类型.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);
}

您可能想要创建一个采用IEnumerable< NameValuePair>的AddRange方法.此时你可以调用AddRange(查询).

或者,您可以使用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));
    }
}

这样做的好处是,它基本上只通过一次类型列表来构建字典.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读