2013-07-26 71 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