c# - 如何使用 LINQ 来避免嵌套循环?

标签 c# linq-to-objects

我一直在阅读有关 LINQ to Objects 的文章,现在我的同事希望我向他们展示它。

现在,我对运算符和语法选择有了一定的了解,但我听说您可以使用 LINQ 避免繁重的嵌套循环。不过,我很难想出一组很好的“之前和之后”代码 list 来证明这一点。

我在 Magennis 的书中找到了使用和不使用 LINQ 进行排序和分组的一个很好的例子,他还有一个编写 xml 的例子。但是那些嵌套循环呢?考虑到我们通常需要一个或两个 foreach 循环来遍历查询结果,这甚至是一个现实的说法吗?

如果有人能向我解释这个想法(最好有具体的例子),我将不胜感激。

最佳答案

假设您有很多产品,例如:

var products = new List<Product>
    {
        new Product { Id = 1, Category = "Electronics", Value = 15.0 },
        // etc.
    };

如果您想查找值(value) > 100.0 美元的所有产品,并按类别分组,您可以使用 foreach 执行此操作:

var results = new Dictionary<string, List<Product>>();

foreach (var p in products)
{
    if (p.value > 100.0)
    {
        List<Product> productsByGroup;

        if (!results.TryGetValue(p.Category, out productsByGroup))
        {
            productsByGroup = new List<Product>();
            results.Add(p.Category, productsByGroup);
        }
        productsByGroup.Add(p);
    }
}

或者,您可以简单地使用 LINQ 方法:

var results = products.Where(prod => prod.Value > 100.0)
                  .GroupBy(prod => prod.Category);

或者使用 LINQ 表达式语法:

var results = from p in products 
                  where p.Value > 100.0
                  group p by p.Category;

更加简洁且不易出错。

关于c# - 如何使用 LINQ 来避免嵌套循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8301904/

相关文章:

c# - 我可以在不使用设计器的情况下创建数据集 XSD 吗?

c# - 生成的 WEB API 帮助区域文档不显示响应正文格式/示例

c# - Linq to Object 的日期时间周期

c# - 从一个集合中删除另一个集合中的项目

c# - Linq to objects - 从其他集合中搜索具有值的集合

c# - 有条件地获取 Parent 和 Child 对象

c# - 如何对 LINQ to Objects 查询进行分区?

c# - 从 Server.UrlEncode 获取大写字符串

c# - 使用抽象方法显式实现接口(interface)

c# - 在不触及注册表的情况下将页眉和页脚信息添加到 WebBrowser 的打印输出