C # - Любой умный способ получить массив int из коллекции объектов? - PullRequest
1 голос
/ 09 августа 2010

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

Идея будет иметь метод, который получает коллекцию класса "Пользователь":

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 09 августа 2010

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

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);
2 голосов
/ 09 августа 2010

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

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();

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

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

0 голосов
/ 09 августа 2010
 List<int> uniqueUserIds = (from n in list  
                            select item.UserId).Distinct().ToList(); 
...