#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 не был частью вопроса, это могло бы быть полезно.