如何对具有相同子对象列表的对象进行分组?

汤姆·麦克林

我正在尝试对对象列表进行分组,这些对象具有作为列表的属性。使用以下表达式时,它不会将具有列表的对象分组在一起,大概是因为当检查每个列表的相等性时,即使内容相同,也不匹配。

我知道这是问题所在,好像我停止对列表进行分组一样,代码输出的是两个项目而不是三个。

如何调整我的表达式,以便正确地将前两个项(相同)分组为一个?

public class Item {
  public string Id { get; set; }
  public string Name { get; set; }
  public IEnumerable<ChildItem> Children { get; set; }
}

public class ChildItem {
  public string ChildItemName { get; set; }
}
var items = new List<Item> {
  new Item {
    Id = "00001",
    Name = "My Item",
    Children = new List<ChildItem> {
      new ChildItem { ChildItemName = "string 1" },
      new ChildItem { ChildItemName = "string 2" },
    }
  },
  new Item {
    Id = "00001",
    Name = "My Item",
    Children = new List<ChildItem> {
      new ChildItem { ChildItemName = "string 1" },
      new ChildItem { ChildItemName = "string 2" },
    }
  },
  new Item {
    Id = "00002",
    Name = "My Second Item",
    Children = new List<ChildItem> {
      new ChildItem { ChildItemName = "string 3" },
    }
  }
};

var result =
  from c in items
  group c by new
  {
    c.Id,
    c.Name,
    c.Children,
  }
  into gcs
  select new Item()
  {
    Id = gcs.Key.Id,
    Name = gcs.Key.Name,
    Children = gcs.Key.Children
  };
奥利维尔·雅各·德斯科姆斯

如果具有相同ID的项目具有相同的名称和集合,则可以按ID分组,然后采用该组的第一项

IEnumerable<Item> uniqueItems = items
    .GroupBy(x => x.Id)
    .Select(g => g.First());

您无需将所有内容都放入组密钥。


根据您的评论,由于Id不能保证唯一性,因此您必须提供自己对“相等”含义的定义。您可以通过实现自己的相等比较器来做到这一点。

ChildItem作为singleton的实现,因为它将在中重复使用ItemEqualityComparer.Equals

class ChildItemEqualityComparer : IEqualityComparer<ChildItem>
{
    public static readonly ChildItemEqualityComparer Instance =
        new ChildItemEqualityComparer(); // Create singleton.
    private ChildItemEqualityComparer() { } // Hide constructor.

    public bool Equals(ChildItem x, ChildItem y) =>
        String.Equals(x.ChildItemName, y.ChildItemName);
    public int GetHashCode(ChildItem childItem) =>
        childItem.ChildItemName?.GetHashCode() ?? 0;
}

一个实现Item

class ItemEqualityComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        return x.Id == y.Id && x.Name == y.Name &&
            Enumerable.SequenceEqual(x.Children, y.Children,
                ChildItemEqualityComparer.Instance);
    }

    public int GetHashCode(Item item)
    {
        int hash = 43;
        unchecked {
            hash = 17 * hash + (item.Id?.GetHashCode() ?? 0);
            hash = 17 * hash + (item.Name?.GetHashCode() ?? 0);
            foreach (ChildItem childItem in item.Children) {
                hash = 17 * hash + ChildItemEqualityComparer.Instance.GetHashCode(childItem);
            }
        }
        return hash;
    }
}

和查询:

var result = items.Distinct(new ItemEqualityComparer());

这产生2个项目。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Python中对具有相同值的列表和子列表进行排序和分组

来自分类Dev

如何获取具有相同电话号码的对象列表

来自分类Dev

从javascript对象对具有相同数值的键进行分组的最快方法?

来自分类Dev

使用相同的列表属性对对象进行分组

来自分类Dev

如何从其中具有相同对象的实体获取对象列表?-iOS

来自分类Dev

如何使用JavaScript将具有相同名称的对象分组?

来自分类Dev

如何合并具有相同 id 的对象

来自分类Dev

如何通过作为数组的子属性有效地对对象数组进行分组?

来自分类Dev

对具有嵌套级别的对象数组进行分组

来自分类Dev

swift firebase检索该对象的子对象具有相同键的所有对象

来自分类Dev

如何通过数组中嵌套的子对象对象对对象进行分组

来自分类Dev

NSSortDescriptor NSDate升序。如何对具有相同日期的对象进行排序?

来自分类Dev

NSSortDescriptor NSDate升序。如何对具有相同日期的对象进行排序?

来自分类Dev

Java如何在不递归的情况下创建具有相同类型子对象的对象?

来自分类Dev

如何从Python的对象列表中删除具有相同“标题”字段的重复项?

来自分类Dev

如何根据具有多个属性的对象列表中的单个属性返回相同的元素?

来自分类Dev

断言列表具有相同的对象,但hamcrest失败

来自分类Dev

获取具有特定属性相同值的对象的列表

来自分类Dev

从过滤器具有相同的成员对象的列表

来自分类Dev

断言列表具有与hamcrest失败相同的对象

来自分类Dev

如何通过子属性对相同对象的数组进行排序?

来自分类Dev

列表中存储的对象具有相同的ID或指向相同的对象

来自分类Dev

按对象的属性以外的对象对对象列表进行分组

来自分类Dev

按对象的属性以外的对象对对象列表进行分组

来自分类Dev

如何将具有自定义数据“ x”的div与具有相同“ x”值的json对象进行匹配?

来自分类Dev

对象的数组列表-如何添加具有重复值的对象

来自分类Dev

将数组与对象数组进行比较,并返回具有分组日期的新对象数组

来自分类Dev

如何将具有每个元素数组的对象列表转换为以子元素为属性的对象数组

来自分类Dev

如何仅对具有子列表的列表进行更改?

Related 相关文章

  1. 1

    在Python中对具有相同值的列表和子列表进行排序和分组

  2. 2

    如何获取具有相同电话号码的对象列表

  3. 3

    从javascript对象对具有相同数值的键进行分组的最快方法?

  4. 4

    使用相同的列表属性对对象进行分组

  5. 5

    如何从其中具有相同对象的实体获取对象列表?-iOS

  6. 6

    如何使用JavaScript将具有相同名称的对象分组?

  7. 7

    如何合并具有相同 id 的对象

  8. 8

    如何通过作为数组的子属性有效地对对象数组进行分组?

  9. 9

    对具有嵌套级别的对象数组进行分组

  10. 10

    swift firebase检索该对象的子对象具有相同键的所有对象

  11. 11

    如何通过数组中嵌套的子对象对象对对象进行分组

  12. 12

    NSSortDescriptor NSDate升序。如何对具有相同日期的对象进行排序?

  13. 13

    NSSortDescriptor NSDate升序。如何对具有相同日期的对象进行排序?

  14. 14

    Java如何在不递归的情况下创建具有相同类型子对象的对象?

  15. 15

    如何从Python的对象列表中删除具有相同“标题”字段的重复项?

  16. 16

    如何根据具有多个属性的对象列表中的单个属性返回相同的元素?

  17. 17

    断言列表具有相同的对象,但hamcrest失败

  18. 18

    获取具有特定属性相同值的对象的列表

  19. 19

    从过滤器具有相同的成员对象的列表

  20. 20

    断言列表具有与hamcrest失败相同的对象

  21. 21

    如何通过子属性对相同对象的数组进行排序?

  22. 22

    列表中存储的对象具有相同的ID或指向相同的对象

  23. 23

    按对象的属性以外的对象对对象列表进行分组

  24. 24

    按对象的属性以外的对象对对象列表进行分组

  25. 25

    如何将具有自定义数据“ x”的div与具有相同“ x”值的json对象进行匹配?

  26. 26

    对象的数组列表-如何添加具有重复值的对象

  27. 27

    将数组与对象数组进行比较,并返回具有分组日期的新对象数组

  28. 28

    如何将具有每个元素数组的对象列表转换为以子元素为属性的对象数组

  29. 29

    如何仅对具有子列表的列表进行更改?

热门标签

归档