首页 > 解决方案 > Linq 按属性将对象划分为多个对象

问题描述

我只是想知道是否有一种方法可以使用 C# LINQ 基于对象属性将列表项拆分为两个列表项。

例如:

{
  "ItemName": "Test Item",
  "SubItemName": [
    {
      "Sub-Item-1",
      "Sub-Item-2",
    }
  ]
}

如何通过 subItemName 拆分此对象,例如:

{
  "ItemName": "Test Item Name",
  "SubItemName": "Sub-Item-1"
},
{
  "ItemName": "Test Item Name",
  "SubItemName": "Sub-Item-2",  
}

标签: c#linq

解决方案


是的,就是SelectMany。让我们看一个简单的例子:

class C
{
  public string Name { get; set; }
  public IEnumerable<string> Subs { get; set; }
}

现在让我们制作一堆。

var cs = new List<C> {
  new C { Name = "Alice", Subs = new List<string> { "Orange", "Green" }},
  new C { Name = "Bobby", Subs = new List<string> { "Red", "Blue" }}
}

也就是说,我们有

Alice
  Orange
  Green
Bobby
  Red
  Blue

你想要一个新的列表

Alice
  Orange
Alice
  Green
Bobby
  Red
Bobby
  Blue

正确的?

任何时候您想“展平”您使用 SelectMany 的列表列表。无论是理解形式:

var query = 
  from c in cs
  from s in c.Subs
  select new C { Name = c.Name, Subs = new List<string> { s } };  

或以流利的形式

var query = 
  cs.SelectMany(
    c => c.Subs,
    (c, s) => new C { Name = c.Name, Subs = new List<string> { s } });

如您所见,它具有相同的结构,只是更难阅读。

如果您需要另一端的列表:

var newList = query.ToList();

你完成了。


推荐阅读