Linq Разделить объект на несколько объектов по свойству - PullRequest
0 голосов
/ 24 марта 2020

Мне просто интересно, есть ли способ разбить элемент списка на два элемента списка на основе свойства объекта, используя 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",  
}

Ответы [ 3 ]

1 голос
/ 24 марта 2020

Да, это 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();

И все готово.

1 голос
/ 24 марта 2020

Один предмет:

var item = new {
  ItemName = "Test Item",
  SubItemName = new string[]
    {
      "Sub-Item-1",
      "Sub-Item-2",
    }
};

Полагаю, у вас есть коллекция таких предметов:

var items = new [] { item, /* other items */ };

А вот ссылка:

var result =
    from i in items
    from si in i.SubItemName
    select new 
    {
        ItemName = i.ItemName,
        SubItemName = si
    };
0 голосов
/ 24 марта 2020

используйте метод LINQ .Select () для коллекции

Вы можете использовать метод .Select(), чтобы спроецировать вещи из вашей коллекции SubItems в совершенно новую форму.

Поскольку вы не опубликовали код того, что у вас есть, я отвечу в целом. Проверьте этот код. :

public class WhateverYouHaveThere
{
    public string Name { get; set; }

    public List<string> SubItemName { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        //the thing you have
        var theThingYouHave = new WhateverYouHaveThere() { 
            Name = "Test Item",
            SubItemName = new List<string>() {
                "Sub-Item 1", 
                "SubItem 2" } 
        };

        //split the thing into a new list
        var theResultingListYouWant = theThingYouHave.SubItemName
            .Select(p => new WhateverYouHaveThere() { 
                Name = theThingYouHave.Name, 
                SubItemName = new List<string>() { p } }
            ).ToList();
    }
}

примите в качестве ответа, если это сработало для вас

привет, Майк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...