2015-10-14 3 views
-1

оптимального качества я всегда использую эту технику, чтобы иметь дело с дубликатами от List<T> с помощью LinqLinq удалить дубликаты

var distrinctPricings = pricings.OrderByDescending(x => x.ValidFrom).GroupBy(x => x.Quantity).Select(x => x.First()); 

pricings коллекции списка пользовательских типа не реализаций любого рода сопоставимых.

Здесь я беру только самые последние принцы, когда есть один с тем же количеством.

Это прекрасно работает, но мне было интересно, не было ли лучшего способа сделать это, потому что это действительно похоже на взлом imo.

+0

Я не уверен, что понимаю этот вопрос, но что-то не так с ['.Distinct()') (https://msdn.microsoft.com/en-us/library/vstudio/bb348436 (v = vs 0,100) .aspx)? – MikeTheLiar

+0

@mikeTheLiar Я предполагаю, что 'pricings' представляет собой коллекцию нестандартного типа, и он не реализовал каких-либо сопоставимых. –

+0

@ Дайте разумное предположение, но также легко исправим. – MikeTheLiar

ответ

0

Ну, я действительно не думаю, что у вас есть взлома, но поскольку вы упомянули о «оптимизации», вы, безусловно, можете улучшить производительность, не делая своего рода. Вам нужно только один проход через перечислимого:

var d = new Dictionary<int, Pricing>(): // Assuming .Quantity is an int 

foreach(var p in pricings) 
{ 
    if (!d.ContainsKey(p.Quantity) || p.ValidFrom > d[p.Quantity].ValidFrom) 
    { 
     d[p.Quantity] = p; 
    } 
} 

ли это на самом деле стоит это зависит от того, сколько элементов вы имеете в pricings. Вам нужно профилировать, чтобы найти точку безубыточности, но для очень длинного перечисления вышеприведенный подход более эффективен, чем делает вид.

+0

Сортировка важна тем, что она влияет на элемент, который хранится, если есть дубликаты. Если вы не сортируете данные, их эффективно произвольные, которые сохраняются, если вы выполните сортировку, то ее четко определите. Если вы выполняете сравнение для каждого совпадающего совпадения, то вы выполняете сопоставимую работу, как делаете вид. – Servy

+0

@Servy На самом деле это не является произвольным, который вы сохраняете, поскольку вы заменяете элемент только индексом 'p.Quantity', если' ValidFrom' больше. См. Второе предложение в условии оператора if. Я не очень-то знаком с характеристиками сложности здесь, но я уверен, что это O (N), учитывая, что вы можете взять чистую работу, необходимую для сравнения со словарным элементом, и заменить элемент как константу , Выполнение сортировки не может быть выполнено лучше, чем O (N logN) в среднем (или, по крайней мере, я уверен, что 'OrderBy' не работает лучше, чем это). –

+0

@Servy Полагая это проще, делать вид - это неэффективный способ найти максимальное значение. Тот факт, что мы находим независимые максимальные значения для каждого значения '.Quantity', на самом деле не меняет этого. –

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