【问题标题】:Remove Duplicate Entries of 'Multicolumn'-List with LINQ使用 LINQ 删除“多列”列表的重复条目
【发布时间】:2013-07-26 22:14:47
【问题描述】:

我确实有 2 个相同用户定义类型的列表。每个包括:ID、TimesTested、varA、varB。

需要加入列表,然后将其保存到本地文件。需要删除重复条目。

问题是我不能只搜索 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

【问题讨论】:

    标签: .net regex vb.net linq duplicate-removal


    【解决方案1】:

    一种方式,使用Enumerable.GroupBy,然后根据TimesTested选择最高的。

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

    编辑 ...或在 VB.NET 中(抱歉,我没有先看到标签)并使用您的方法:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 2017-11-28
      • 1970-01-01
      相关资源
      最近更新 更多