0

同じユーザー定義型のリストが 2 つあります。それぞれ、ID、TimesTested、varA、varB で構成されます。

リストを結合して、ローカル ファイルに保存する必要があります。重複するエントリは削除する必要があります。

問題は、「TimesTested」の値が高いエントリを常に保持する必要があるため、ID を検索して既に存在するかどうかを確認できないことです。

リストの両方をループして戻り、値を手動で確認したくありません。だから私はLINQを考えています。

私が与えた場合、次のことを行うことは可能ですか:

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

2行目だけを保持するには?(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
4

1 に答える 1

0

片道、 を使用して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
于 2013-07-26T22:26:29.270 に答える