【问题标题】:How do I create subsets of one list from one condition in c#如何从 C# 中的一个条件创建一个列表的子集
【发布时间】:2019-10-10 21:26:39
【问题描述】:

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

就我而言,我有一个元组列表(参见下面的示例)。我想将我的列表分成 X 个子集,其中每个 item2 都相等。我已经找到了一个解决方案,即在string 上执行GroupBy 以将item2 的所有可能值放入一个列表中,然后在foreach 中,获得一个新列表,其中item2 等于当前@ 987654325@.

但是,我觉得它效率不高,必须有一个 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
            }

【问题讨论】:

  • GroupBy() 应该是最优的——你的代码是什么样的?
  • 期望的输出是什么?
  • 我更新了我想要的输出并添加了我的代码

标签: c# linq


【解决方案1】:

你的意思是这样的吗?

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

【讨论】:

  • 是的,正是这个,但我想知道.Select(group => group.ToList()) 语句的作用是什么?我所做的是像你一样的 GroupBy,然后在另一行中,Where() 声明 where item2 == groupbyClause.Key
  • group => group.ToList() 只是获取组中的所有项目并将它们变成一个列表 - 否则它是一个 IEnumerable((bool, string))(对于这个例子)。组只是一个键(项目分组的值)和该组中所有项目的 IEnumerable。
  • @luisarcher 我添加了另一个示例来展示如何在不将它们转换为列表的情况下访问组的项目 - 如果你能这样做当然会更有效率。
猜你喜欢
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
相关资源
最近更新 更多