class obj
{
int typeId; //10 types 0-9
string uniqueString; //this is unique
}
Предположим, есть список из 100 элементов obj, но только 10 уникальных идентификаторов типа.
Можно ли написать запрос LINQ, чтобы вернуть 10 уникальных целых значений из списка объектов?
Ответы:
источник
Предполагая, что вам нужен полный объект, но вы хотите иметь дело только с отличимостью
typeID
, в LINQ нет ничего, что могло бы упростить эту задачу. (Если вам просто нужныtypeID
значения, это просто - спроецируйте это с помощью,Select
а затем используйте обычныйDistinct
вызов.)В MoreLINQ есть
DistinctBy
оператор, который вы можете использовать:var distinct = list.DistinctBy(x => x.typeID);
Однако это работает только для LINQ to Objects.
Вы можете использовать группировку или поиск, это немного раздражает и неэффективно:
var distinct = list.GroupBy(x => x.typeID, (key, group) => group.First());
источник
Если вы просто хотите использовать чистый Linq, вы можете использовать groupby:
Если вы хотите, чтобы во всем приложении использовался метод, аналогичный тому, что делает MoreLinq :
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; } } }
Используя этот метод для поиска различных значений, используя только свойство 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?
источник
.First
это нормально, так как у вас не было бы группы, если бы в ней что-то не было.GroupBy
упростить задачу, вы также можете использовать альтернативную перегрузку - см. Мой ответ.Если вы просто хотите использовать Linq, вы можете переопределить методы Equals и GetHashCode .
Класс продукции :
public class Product { public string ProductName { get; set; } public int Id { get; set; } public override bool Equals(object obj) { if (!(obj is Product)) { return false; } var other = (Product)obj; return Id == other.Id; } public override int GetHashCode() { return Id.GetHashCode(); } }
Основной метод:
static void Main(string[] args) { var products = new List<Product> { new Product{ ProductName="Product 1",Id = 1}, new Product{ ProductName="Product 2",Id = 2}, new Product{ ProductName="Product 4",Id = 5}, new Product{ ProductName="Product 3",Id = 3}, new Product{ ProductName="Product 4",Id = 4}, new Product{ ProductName="Product 6",Id = 4}, new Product{ ProductName="Product 6",Id = 4}, }; var itemsDistinctByProductName = products.Distinct().ToList(); foreach (var product in itemsDistinctByProductName) { Console.WriteLine($"Product Id : {product.Id} ProductName : {product.ProductName} "); } Console.ReadKey(); }
источник
Я хотел привязать определенные данные к раскрывающемуся списку, и они должны быть разными. Я сделал следующее:
List<ClassDetails> classDetails; List<string> classDetailsData = classDetails.Select(dt => dt.Data).Distinct.ToList(); ddlData.DataSource = classDetailsData; ddlData.Databind();
Посмотрим, поможет ли это
источник