2012-07-09 62 views
0

我有一個包含2個字符串屬性,名稱的對象AppDetail和版本字符串(如「1.0.0」)獲得最高值列表中不同項目的物業

給定一個列表< AppDetail>包含重複的同名但不同的版本字符串,我如何創建一個具有唯一名稱和最高版本的列表?

例如從最初的名單

"name", "1.0.1" 
"name", "1.1.0" 

這2項我想唯一項目名單隻包含第二個項目,因爲它具有最高的版本。

比較,我需要創建一個用於創建對象版本的IComparer的版本,然後使用version.CompareTo(版本)方法。但那沒有用,因爲List.Distinct overload只接受IEqualityComparer,而不接受IComparer。

有什麼想法?由於

回答

2

它使得其爲IComparer接口的目的意義上List.Distinct()不接受IComparer,由於確定是否兩個項目是不同的不要求知道是否一個項目將先於另一(或反之亦然)。相反,所有需要的是要知道兩個項目是否是等於,這也正是爲什麼IEqualityComparer存在。

你並不需要實現兩種,雖然。您可以創建選擇合適的項目的查詢,首先按名稱分組的所有項目,然後選擇只從每個組的最高版本號:

var namesWithHighestVersion = 
    appDetailList 
     .GroupBy(x => x.Name) 
     .Select(x => new AppDetail { 
         Name = x.Key, 
         Version = x.Max(x => new Version(x.Version)).ToString() 
         }) 
     .ToList(); 

請注意,這將創建一個新的列表,而不是更新舊名單。

此外,您可以通過將原始類型使用Version,而不是字符串有所簡化一切。

1
在漂亮的SQL顯示

簡單的查詢:

var aDetail = from a in appdetail 
       group a by a.name into aGroup 
       orderby a.version descending 
       select new 
        {name = aGroup.name, 
        version = aGroup.Max(version)}.ToList(); 

分組自然會使查詢不同

對不起早些時候在使用MaxBy,包括在這裏發現了以下項目:"more linq"讓我本能地想到MaxBy。

0

該解決方案類似於dlev的答案,但是,它會返回而不是用相同的值創建一個新的實例的一個最高版本的實例。

var namesWithHighestVersion = 
    appDetailList 
     .GroupBy(a => a.Name) 
     .Select(g => g.OrderByDescending(a => a.Version).First()) 
     .ToList(); 
+1

這肯定是相似的,但錯在一個關鍵途徑:調用'OrderByDescending()'用'string'參數將字典順序排序的項目,用版本號處理(例如2.2> 2.10時都是時可能是錯誤的考慮一個字符串。) – dlev 2012-07-09 23:37:52

0

var latestVersion =(from a in appDetailList select a.Version).Max();

相關問題