2012-11-28 3 views
0

У меня есть класс, и список его так:Как выбрать подпоследовательность списка на основе уникального значения в свойстве

public class Person { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime Birthday { get; set; } 
} 

// and my list is: 
var persons = new List<Person>(); 
persons.add(/* add for example 20 person here */); 

Эти лица могут иметь дубликат FirstName и LastName. Я хочу выбрать подпоследовательность людей, что все FirstName vs LastName отличаются друг от друга. Я имею в виду, что мой первичный ключ (в реляционном видении db) - FirstName + LastName.

Я знаю, что могу сделать это, итерируя список. Но я прошу решение LINQ. Здесь есть кто-нибудь? Можно ли выбрать указанную подпоследовательность на LINQ? Любая идея, пожалуйста?

+0

Вы можете реализовать 'IEqualityComparer ' в классе 'PersonComparer' и передать объект' PersonComparer' для LINQ 'Четкая 'метод. –

ответ

1

Создать Lookup<TKey, TElement> Class на основе FirstName+LastName ключа и принимать только первый из каждой подколлекции (как только вы никогда ничего не говорили о том, что это rder или что-то) через Enumerable.ToLookup Method и Enumerable.Select Method:

var result = persons.ToLookup(p => string.Concat(p.FirstName, p.LastName)) 
        .Select(l => l.First()); 
+0

Это точно wath я хочу. Заранее спасибо –

1

Вы хотите только уникумы ? Вы можете использовать Enumerable.GroupBy, затем подсчитывать каждую группу:

var uniquePersons = persons 
        .GroupBy(p => new { p.FirstName, p.LastName }) 
        .Where(g => g.Count() == 1) 
        .Select(g => g.First()); 

Вот демо: http://ideone.com/nsbyyI

+0

Благодаря помощи, но не только уникальным лицам. На самом деле, я хочу выбрать людей, имеющих одно и то же имя и фамилию только одного из них. Я имею в виду удалить людей, которые встречаются больше, чем один, и просто держать один из каждого. (Мой английский слишком плохой :(извините) –

+0

+1: Мне, вероятно, нравится ваш запрос даже больше, чем мой – horgh