Объединение элементов в linq

#c# #linq #concat

#c# #linq #объединение

Вопрос:

У меня есть следующий код:

 class Person
{
    public String Name { get; set; }
    public String LastName { get; set; }
    public String City { get; set; }

    public Person(String name, String lastName, String city)
    {
        Name = name;
        LastName = lastName;
        City = city;
    }
}

...

personList.Add(new Person("a", "b", "1"));
personList.Add(new Person("c", "d", "1"));
personList.Add(new Person("e", "f", "2"));
personList.Add(new Person("g", "h", "1"));
personList.Add(new Person("i", "j", "2"));
personList.Add(new Person("k", "l", "1"));
personList.Add(new Person("m", "n", "3"));
personList.Add(new Person("o", "p", "3"));
personList.Add(new Person("q", "r", "4"));
personList.Add(new Person("s", "t", "5"));
  

Итак, я хочу сгруппировать список по городам, и я делаю следующее;

 var result = personList.GroupBy(x => x.City);
  

Но теперь я хочу объединить элементы, которые имеют 1 или 3 в качестве города (это можно указать динамически)

Пример:

Первый элемент в результате вернет массив людей, которые содержат города 1, 3

Спасибо!

Комментарии:

1. Не могли бы вы указать, каковы ваши критерии для «объединения» элементов. Вы явно знаете, как группировать в LINQ, и я уверен, что вы бы сами разобрались с предложением Where. Просто пытаюсь лучше понять ваш вопрос.

Ответ №1:

Вы можете просто использовать Where() фильтр и спроецировать каждую оставшуюся группу в массив, используя ToArray() :

 var result = personList.GroupBy(x => x.City)
                       .Where ( g => g.Key == someCity || g.Key == anotherCity)
                       .Select( g => g.ToArray());
  

Ответ №2:

Сначала создайте список городов, по которым вы хотите выполнить поиск

 List<int> citesToFind = new List<int>();
// add 1, 3, etc to this list (can be generated dyamically)
  

Затем используйте .Contains() в своем LINQ:

 var result = from person in personList
             where citiesToFind.Contains(person.City)
             select person;
  

Конечно, вы можете добавить любую другую группировку или фильтрацию, которую хотите, но .Contains() я думаю, что использование — это важная часть, которую вы упускаете.

Ответ №3:

Как насчет следующего? Вы можете вставить его в метод расширения, если хотите сделать использование более аккуратным.

 var personDictionary = new Dictionary<string, List<Person>>();
foreach(var person in personList)
{
  if (personDictionary.HasKey(person.City)
  {
    personDictionary[person.City].Add(person);
  }
  else
  {
    personDictionary[person.City] = new List<Person>{person};
  }
}
  

Затем вы можете запросить personDictionary для людей из любого города по вашему выбору.

Комментарии:

1. Если бы linq не был частью вопроса, это могло бы быть полезно.