Ответ 1
objList.Select(o=>o.typeId).Distinct()
class obj
{
int typeID; //10 types 0-9
string uniqueString; //this is unique
}
Предположим, что существует список из 100 элементов obj, но только 10 уникальных идентификаторов типа.
Можно ли написать запрос LINQ, чтобы вернуть 10 уникальных ints из списка объектов?
objList.Select(o=>o.typeId).Distinct()
Предполагая, что вы хотите полный объект, но хотите иметь дело с отличием 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());
Если вы просто хотите, чтобы пользователь был чистым 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 });
Конечно, используйте Enumerable.Distinct
.
Учитывая коллекцию obj
(например, foo
), вы сделали бы что-то вроде этого:
var distinctTypeIDs = foo.Select(x => x.typeID).Distinct();
Я думаю, что это то, что вы ищете:
var objs= (from c in List_Objects
orderby c.TypeID select c).GroupBy(g=>g.TypeID).Select(x=>x.FirstOrDefault());
Аналогично этому Возврат отличительного IQueryable с LINQ?
Я хотел связать отдельные данные с выпадающим списком, и он должен быть отличным. Я сделал следующее:
List<ClassDetails> classDetails;
List<string> classDetailsData = classDetails.Select(dt => dt.Data).Distinct.ToList();
ddlData.DataSource = classDetailsData;
ddlData.Databind();
Посмотрите, помогает ли это