2013-07-26 118 views
0

我確實有兩個相同用戶定義類型的列表。每個包含:ID,TimesTested,varA,varB。用LINQ刪除'多列'列表的重複項目

該列表需要加入,然後保存到本地文件。重複的條目需要刪除。

問題是我不能只搜索ID並檢查它是否已經存在,因爲我總是需要保留'TimesTested'具有較高值的​​條目。

我真的不想循環通過兩個列表,並返回並手動檢查值。所以我在想LINQ。

是否有可能做到以下幾點,如果我已經給:

4, 16, X, Y 
4, 19, X, Y 

只保持第二排? (使用LINQ,或以另一種'聰明'方式)

如果是的話,可以請你解釋一下嗎?


奇怪的是,它工作時,我第一次從本地文件加載值。 也是第一儲蓄似乎工作順利......但是當我嘗試第二次寫列表文件..我得到以下錯誤:

Unable to cast object of type "WhereSelectEnumerableIterator`2[System.Linq.IGrouping`2[System.Int32,mcq_gui.clsEvaluation+History+EvaluationQuestionData],mcq_gui.clsEvaluation+History+EvaluationQuestionData]" to type Typ "System.Collections.Generic.List`1[mcq_gui.clsEvaluation+History+EvaluationQuestionData]" 

這是我使用的代碼:

Friend Shared Function GetNewerEvalQs(list1 As List(Of EvaluationQuestionData), list2 As List(Of EvaluationQuestionData)) As List(Of EvaluationQuestionData) 
     Dim uniques As New List(Of EvaluationQuestionData) 
     Try 
      If list1.Count > 0 And list2.Count > 0 Then 
       uniques = list1.Concat(list2).GroupBy(Function(t) t.ID).[Select](Function(g) g.OrderByDescending(Function(t) t.TimesTested).First()) 
      Else 
       If list1.Count > 0 Then 
        Return list1 
       ElseIf list2.Count > 0 Then 
        Return list2 
       Else 
        Return Nothing 
       End If 
      End If 

      Return uniques 
     Catch ex As Exception 
      Debug.Print(ex.Message) 
      Return Nothing 
     End Try 
    End Function 

回答

0

的一種方法,使用Enumerable.GroupBy然後根據TimesTested選擇最高的。

var uniques = list1.Concat(list2) 
    .GroupBy(t => t.ID) 
    .Select(g => g.OrderByDescending(t => t.TimesTested).First()); 

編輯 ...或VB.NET(對不起,我沒「T看到標記第一次),並用你的方法:

Friend Shared Function GetNewerEvalQs(list1 As List(Of EvaluationQuestionData), list2 As List(Of EvaluationQuestionData)) As List(Of EvaluationQuestionData) 
    list1 = If(list1 Is Nothing, New List(Of EvaluationQuestionData), list1) 
    list2 = If(list2 Is Nothing, New List(Of EvaluationQuestionData), list2) 
    If Math.Max(list1.Count, list2.Count) = 0 Then Throw New ArgumentException("One of both lists must contain data") 

    Dim newUniqueData = list1.Concat(list2). 
     OrderByDescending(Function(eqd) eqd.TimeTested). 
     GroupBy(Function(eqd) eqd.ID). 
     Select(Function(g) g.First()). 
     ToList() 
    Return newUniqueData 
End Function