首页 > 解决方案 > 如何从 C# 中的一个条件创建一个列表的子集

问题描述

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

就我而言,我有一个元组列表(参见下面的示例)。我想将我的列表分成 X 个子集,其中每个 item2 都相等。我已经找到了一个解决方案,即执行 a GroupByonstring将所有可能的值item2放入一个列表中,然后在 aforeach中,获取一个新列表,其中 item2 等于 current 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
            }

标签: c#linq

解决方案


你的意思是这样的吗?

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();
            }
        }
    }
}

推荐阅读