当前位置:  开发笔记 > 编程语言 > 正文

用LINQ查询替换foreach

如何解决《用LINQ查询替换foreach》经验,为你挑选了2个好方法。

我的一个方法中有以下代码:

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.



1> Keith..:

基本上:

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)



2> Jon Skeet..:

编辑:我没有受人注目的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));
    }
}

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

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有