【问题标题】:How to group a List<T> that has a property of List<string> by that nested List?如何通过该嵌套列表对具有 List<string> 属性的 List<T> 进行分组?
【发布时间】:2012-07-09 15:32:45
【问题描述】:

我有一个包含List&lt;string&gt; 的自定义数据类型。

我希望通过嵌套的List&lt;string&gt;CustomDataType 中的List 进行分组。

我已经尝试了以下

 compoundSchedules.GroupBy(a => a.Timepoints);

其中Timepoints 是表示为字符串的日期列表。如果任何CustomDataTypes 具有相同的时间点,我希望将它们组合在一起。 使用上面的代码,它不会对它们进行分组,而是只是重复 CustomDataTypeList,其时间点列表为 IGrouping Key

谢谢。

【问题讨论】:

  • “时间点”是日期时间吗?如果是的话,也许他们有相同的日期,但不同的时间。这将导致它们不会被组合在一起,因为它们必须在默认情况下完全相同
  • 见标题,TimepointsList&lt;string&gt;
  • 您是否将时间存储为字符串,何时应该将它们存储为日期时间?

标签: c# linq group-by


【解决方案1】:

您应该创建一个IEqualityComparer&lt;List&lt;string&gt;&gt; 来检查列表是否具有相同的长度和内容,并使用Enumerable.GroupBy 的重载:

compoundSchedules.GroupBy(a => a.Timepoints, myComparer);

要么这样,要么创建自己的类作为时间点列表,并让它实现 default comparer 使用的 GetHashCodeEquals(和/或实现 IEquatable&lt;T&gt;)。

【讨论】:

    【解决方案2】:

    我想到了两件事。首先是创建一个 Timepoints 类并实现 IComparable。然后你可以比较每个列表的每个元素,看看它们是否相等。或者,您可以在复合计划中创建一个新属性,其中包含列表的哈希码。

    【讨论】:

      【解决方案3】:

      由于TimepointsList&lt;string&gt; - 我将构造一个聚合字符串并按此分组。您可以使用 Aggregate 方法完成此操作

      compoundSchedules.GroupBy(a => a.Timepoints.Aggregate( (x,y) => x + y));
      

      【讨论】:

      • 如果Timepoints 中的字符串相同但顺序不同怎么办?如果这在 OP 的场景中是可能的,那么您还必须确保在聚合之前对它们进行排序。尽管如此,考虑到所提问题的条件,这还是一个不错的建议。
      【解决方案4】:

      您可以按连接的字符串列表进行分组:

      var grouped = compoundSchedules.GroupBy(cs => string.Join("", cs.Timepoints));
      

      这也会处理相同的订单(如果需要的话)。

      【讨论】:

      • ["Hello world"]["Hello ", "world"] 在此定义下将是相同的字符串。
      • @TimS.:你是对的。但由于Timepoints 只是一个“混淆”日期时间列表,它应该可以工作。我假设“Hello world”不是有效的 DateTime。
      • @TimS。 Timepoints 代表一个日期时间,您不太可能遇到这种情况
      • 好的,好点。只是想我会指出以防万一它可能是一个问题(没有样本数据......你的假设是合乎逻辑的,但不确定),并阻止任何人将此作为一般的“这些列表是否相等”方法。
      猜你喜欢
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多