如何使用Linq和c#迭代从Dictionary返回的列表

本文关键字:Dictionary 返回 列表 迭代 何使用 Linq | 更新日期: 2023-09-27 18:18:18

我需要迭代Linq从字典返回的列表。但是,如果我用ToList(),它就变成了一个List的List。

Dictionary<Tuple<double, double>, List<Tuple<double, double>>> dict = new   Dictionary<Tuple<double,double>,List<Tuple<double,double>>>();
        Random rnd = new Random();
        for(int x =0; x < 3 ; ++x)
        {
             double a = rnd.NextDouble()*100;
             double b = rnd.NextDouble()*100;
             double c = Math.Ceiling(rnd.NextDouble()*100);
             double d = Math.Ceiling(rnd.NextDouble()*100);
             Tuple<double, double> tp = new Tuple<double, double>(c, d);
             List<Tuple<double, double>> ll = new List<Tuple<double,double>>();
             ll.Add(tp);
             c = Math.Ceiling(rnd.NextDouble() * 100);
             d = Math.Ceiling(rnd.NextDouble() * 100);
             tp = new Tuple<double, double>(c, d);
             ll.Add(tp);
             dict.Add(new Tuple<double, double>(a, b), ll);
        }
        var t = dict.Where(x => x.Key.Item1 == 50 || Math.Abs(x.Key.Item1 - 80) < 20).Select(x => x.Value);
        // if I used
        var t = dict.Where(x => x.Key.Item1 == 50 || Math.Abs(x.Key.Item1 - 80) < 20).Select(x => x.Value).ToList();
        // it became a list of list.
        foreach(var u in t)
        // here I cannot use u.item1 why? 
        // t is an Ienumerable of list<Tuple<double, double>>
        // if I used foreach(var u in t.Tolist())
        // it became a list of list.

任何帮助都会很感激。

如何使用Linq和c#迭代从Dictionary返回的列表

不太确定你的数据结构,但你可以这样做:

var t = dict.Where(x => x.Key.Item1 == 50 || Math.Abs(x.Key.Item1 - 80) < 20)
            .SelectMany(x => x.Value)
            .ToList();

最终,如果您有嵌套的集合,SelectMany基本上将许多集合折叠成一个集合。因此,在每个Dictionary的集合的情况下,它将它们扁平化为一个,而不是为每个元素返回IEnumerable,它将它们作为一个漂亮的集合返回:)

MSDN上的示例非常好,并解释了一个对象集合,每个对象都有自己的List<T>。所以基本上当我们执行SelectMany时,它将众多集合扁平化为一个集合,我们可以从中进行Select

额外资源

Select和SelectMany的区别

SelectMany on DotNetPerls