Подтвердить что ты не робот

Linq запрос для возврата различных значений поля из списка объектов

class obj
{
int typeID; //10 types  0-9 
string uniqueString; //this is unique
}

Предположим, что существует список из 100 элементов obj, но только 10 уникальных идентификаторов типа.
Можно ли написать запрос LINQ, чтобы вернуть 10 уникальных ints из списка объектов?

4b9b3361

Ответ 1

objList.Select(o=>o.typeId).Distinct()

Ответ 2

Предполагая, что вы хотите полный объект, но хотите иметь дело с отличием typeID, в LINQ ничего не встроено, чтобы сделать это легко. (Если вам просто нужны значения typeID, легко - проецировать на это с помощью Select, а затем использовать обычный вызов Distinct.)

В MoreLINQ у нас есть DistinctBy, который вы могли бы использовать:

var distinct = list.DistinctBy(x => x.typeID);

Это работает только для LINQ для объектов.

Вы можете использовать группировку или поиск, это несколько раздражает и неэффективно:

var distinct = list.GroupBy(x => x.typeID, (key, group) => group.First());

Ответ 3

Если вы просто хотите, чтобы пользователь был чистым Linq, вы можете использовать groupby:

List<obj> distinct =
  objs.GroupBy(car => car.typeID).Select(g => g.First()).ToList();

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

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (!seenKeys.Contains(keySelector(element)))
        {
            seenKeys.Add(keySelector(element));
            yield return element;
        }
    }
}

поскольку MoreLinq делает

Используя этот метод для поиска различных значений, используя только свойство Id, вы можете использовать:

var query = objs.DistinctBy(p => p.TypeId);

вы можете использовать несколько свойств:

var query = objs.DistinctBy(p => new { p.TypeId, p.Name });

Ответ 4

Конечно, используйте Enumerable.Distinct.

Учитывая коллекцию obj (например, foo), вы сделали бы что-то вроде этого:

var distinctTypeIDs = foo.Select(x => x.typeID).Distinct();

Ответ 6

Я хотел связать отдельные данные с выпадающим списком, и он должен быть отличным. Я сделал следующее:

List<ClassDetails> classDetails;
List<string> classDetailsData = classDetails.Select(dt => dt.Data).Distinct.ToList();
ddlData.DataSource = classDetailsData;
ddlData.Databind();

Посмотрите, помогает ли это