2010-08-09 2 views
1

Как создать простой вспомогательный метод для получения массива int из коллекции объектов?C# - Любой умный способ получить массив int из коллекции объектов?

Идея будет иметь метод, который получает коллекцию класса «User»:

public class User { 
    public int UserId {get;set;} 
    public string UserName {get;set;} 
} 

И отфильтровывать эту коллекцию, чтобы получить целочисленный массив уникальных UserIds.

List<int> repeatedUserIds = (from item in list 
          select item.UserId).ToList(); 
List<int> uniqueUserIds = ((from n in repeatedUserIds 
          select n).Distinct()).ToList(); 

Есть ли способ создать умный метод для этой цели?

ответ

3

Вы можете создать метод расширения:

public int[] GetUniqueIds<T>(this IEnumerable<T> items, Func<T, int> idSelector) 
{ 
    return items.Select(idSelector).Distinct().ToArray(); 
} 

И использовать его как это:

int[] uniqueUserIds = list.GetUniqueIds(u => u.UserId); 
+0

extesions методы являются удивительными. Я адаптировал ToArray() к ToList(), добавил статическое ключевое слово, и он работает очень хорошо. Спасибо, Ли –

0
List<int> uniqueUserIds = (from n in list 
          select item.UserId).Distinct().ToList(); 
2

Ну, я бы не стал заморачиваться с выражением запроса, лично - но все остальное в порядке:

List<int> repeatedUserIds = list.Select(item => item.UserId) 
           .ToList(); 
List<int> uniqueUserIds = repeatedUserIds.Distinct() 
             .ToList(); 

Если вам не нужно repeatedUserIds для чего-нибудь еще, не беспокойтесь промежуточный вызов ToList():

List<int> uniqueUserIds = list.Select(item => item.UserId) 
           .Distinct() 
           .ToList(); 

(. Я вообще, как положить каждую операцию на отдельной строке, но, конечно, вы не должны)

Обратите внимание, что ваш текст запрашивает массив, но ваш код был в терминах List<int>. Если вы действительно хотите int[] вместо List<int>, просто измените ToList() звонки на ToArray().

 Смежные вопросы

  • Нет связанных вопросов^_^