2015-10-14 66 views
-1

我一直在使用這種技術來使用LINQLINQ的刪除重複的優化

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

pricings集合是自定義的列表類型不實施任何形式的可比從List<T>處理重複。

在這裏,我只採取了最新的主題時,有一個具有相同的數量。

它工作正常,但我不知道是否有更好的方法來做到這一點,因爲它真的感覺就像一個黑客海事組織沒有。

+0

我不知道我理解這個問題,但就是有什麼問題['.Distinct()'](https://msdn.microsoft.com/en-us/library/vstudio/bb348436(V = VS .100)的.aspx)? – MikeTheLiar

+0

@mikeTheLiar我假設'價格'是一個自定義類型的集合,他沒有實現任何類型的可比。 –

+0

@Dave合理的猜測,但也很容易補救。 – 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如果'ValidFrom'更大,那麼你只需要替換'p.Quantity'索引處的項目,這並不是真正的任意。請參閱if語句條件中的第二個子句。我對這裏的複雜性特徵並不十分熟悉,但我相當肯定這是O(N),因爲你可以將所需的網絡工作與字典元素進行比較,並將元素替換爲常量。做一個排序不能比O(N logN)平均更好(或者至少,我相當肯定'OrderBy'沒有比這更好)。 –

+0

@Servy簡而言之,進行排序是找到最大值的低效方式。我們爲每個'.Quantity'的值找到獨立的最大值並不會真的改變這一點。 –