如何从C#中的一个条件创建一个列表的子集

时间:2019-10-10 12:57:42

标签: c# linq

使用LINQ,如何将列表拆分为具有相同值的不同列表集?

就我而言,我有一个元组列表(请参见下面的示例)。我想将每个item2相等的X子集划分为我的列表。我已经找到了一种解决方案,该方法是在GroupBy上进行string,将item2的所有可能值放入一个列表,然后在foreach内,获取一个新列表其中item2等于当前的string

但是,我觉得它效率不高,并且必须有一个单独的LINQ语句即可完成所有工作。我想将来知道。

所需的输出应为元组列表,以字符串列中不同值的数量表示

+-------+--------+
| bool  | string |
+-------+--------+
| true  | type1  |
| false | type1  |
| true  | type2  |
| false | type1  |
| false | type2  |
+-------+--------+

我的代码如下:

 var items2 = results.GroupBy(tuple => tuple.Item2);

            foreach (var item in items2)
            {
                var links = results.Where(tuple => tuple.Item2 == 
                            item.Key).ToList();

                // Do what I want with the links List of my Tuple
            }

1 个答案:

答案 0 :(得分:2)

你的意思是这样吗?

using System;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        public static void Main()
        {
            (bool, string)[] tuples =
            {
                (true,  "type1"),
                (false, "type1"),
                (true,  "type2"),
                (false, "type1"),
                (false, "type2")
            };

            var data = tuples
               .GroupBy(item => item.Item2)
               .Select(group => group.ToList())
               .ToList();

            Console.WriteLine($"Group count = {data.Count}");

            foreach (var list in data)
            {
                Console.WriteLine(string.Join(", ", list));
            }
        }
    }
}

输出:

Group count = 2
(True, type1), (False, type1), (False, type1)
(True, type2), (False, type2)

这假定您希望将输出作为组列表(每个组是(bool, string)元组的列表)。

请注意,如果您只需要通过foreach访问元素,则不必不必将组变成列表。例如:

using System;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        public static void Main()
        {
            (bool, string)[] tuples =
            {
                (true,  "type1"),
                (false, "type1"),
                (true,  "type2"),
                (false, "type1"),
                (false, "type2")
            };

            var groups = tuples.GroupBy(item => item.Item2);

            foreach (var group in groups)
            {
                foreach (var item in group)
                {
                    Console.WriteLine(item + ", ");
                }

                Console.WriteLine();
            }
        }
    }
}