【问题标题】:c# linq List property and group byc# linq List 属性和分组依据
【发布时间】:2019-01-23 19:48:40
【问题描述】:

鉴于此示例代码:

var item1 = ("Test1", new List<string>() { "1", "2", "3" });
var item2 = ("Test2", new List<string>() { "1", "2", "3" });
var item3 = ("Test3", new List<string>() { "1", "2", "3" });

var _list = new List<(string ID, List<string> Items)>
{
    item1,
    item2,
    item3
};

var groupby = _list.GroupBy(x => x.Items);

当您在这里调用GroupBy 时,为什么结果不是单个组,因为“项目”列表都是一样的?

【问题讨论】:

  • 你说的Items的列表都一样”是什么意思?每个项目都有一个不同的List&lt;string&gt; Items(即使它们包含相同的字符串,它们在内存中的位置也不同)。
  • 因为每个Items对象在内存中都是不同的List&lt;&gt;对象,而GroupBy默认查看对象引用。
  • _List 中的每个对象都有一个类型为 new List() 的属性,其中包含字符串元素“1”、“2”、“3”。既然都是一样的,为什么group by子句不把它们组合在一起呢。

标签: c# linq group-by


【解决方案1】:

因为列表包含相同顺序的相同元素并不意味着它们是相同的。两个列表相同的默认定义是它们是否具有相同的引用,这意味着它们是否指向内存中的相同对象。

你有三个不同的引用指向三个不同的对象。

如果您想覆盖此行为并重新定义“相同”的含义,您可以为List&lt;string&gt; 实现IEqualityComparer,以检查两个列表是否包含相同顺序的相同元素。并将该比较器提供给GroupBy

【讨论】:

  • 这就解释了。 GroupBy(p => p, new SomeComparer().
  • 这里注意:List&lt;T&gt; 除了引用相等之外没有默认相等比较器的原因是它是一个可变对象。如果一个对象的两个实例在某一时刻相等,那么一个实例会发生变化,其他代码很可能仍会假设它们相等。 (例如,在字典中建立索引。)如果您不对列表进行进一步更改,则可以使用相等比较器,但请注意此处可能会造成混淆错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2012-02-28
相关资源
最近更新 更多