Конкат предметы в linq - PullRequest
2 голосов
/ 01 октября 2011

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

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

Спасибо!

Ответы [ 3 ]

1 голос
/ 01 октября 2011

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

var result = personList.GroupBy(x => x.City)
                       .Where ( g => g.Key == someCity || g.Key == anotherCity)
                       .Select( g => g.ToArray());
0 голосов
/ 01 октября 2011

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

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 людей из любого города по вашему выбору.

0 голосов
/ 01 октября 2011

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

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() - это, я думаю, важная часть, которую вам не хватает.

...