3

(文字列の)リストがあります。例:{"C1"、 "C12"、 "C10"、 "C1"、 "C6"、 "C22"、 "C1"、"C6"}。重複のリストを表示する関数を作成しようとしています:リスト内の{"C1"、"C6"}。各重複は1回だけリストされます。私が書いた関数は、私に何も返しません。理由がわかりません。任意のヘルプまたは代替アプローチをいただければ幸いです。参考までに、C#でも非常によく似た質問がありますが、LINQにまだ慣れていないため、その構文をVB.netに変換する方法がわかりません。ここにあります:LINQを使用してリストから重複アイテムを取得するにはどうすればよいですか?

    ''' <summary>
    ''' Given a List(Of String), returns a list of items that are duplicated in the list.
    ''' Each duplicate returned is unique.
    ''' </summary>
    ''' <param name="Set1"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function GetDuplicateItems(ByVal Set1 As List(Of String)) As List(Of String)
        Dim DistinctItems As IEnumerable(Of String)
        'Dim DistinctResults As New List(Of String)
        Dim DuplicateItems As IEnumerable(Of String)
        Dim ItemsToReturn As New List(Of String)

        'Get a set of unique items in the list
        DistinctItems = Set1.Select(Function(x) x).Distinct()
        'Do I need to enumerate the result in order to force the thing to execute?
        'See remarks section of http://msdn.microsoft.com/en-us/library/bb300779.aspx
        'For Each Item As String In DistinctItems
        '    DistinctResults.Add(Item)
        'Next
        'Do a set subtraction (Set1 - UniqueItems)
        DuplicateItems = Set1.Except(DistinctItems)

        For Each Item As String In DuplicateItems
            ItemsToReturn.Add(Item)
        Next

        Return ItemsToReturn
    End Function
4

1 に答える 1

9

これは遅延実行とは何の関係もありません。アルゴリズムが間違っていますDistinct。リストの一意のアイテムを返さず、重複を削除するだけです。例:あなたの場合の{"C1", "C12", "C10", "C1", "C6", "C22", "C1", "C6"}.Distinct()利回り{"C1", "C12", "C10", "C6", "C22"}。したがって、Set1.Except(DistinctItems)常に空のリストになります。


これがあなたの問題に対する別の解決策です。リスト内の数が1より大きいすべてのアイテムを選択します。

Dim duplicates = list.Where(Function(x) list.Where(Function(y) x = y).Count() > 1).Distinct()

使用例:

Dim list As New List(Of String) From {"a", "a", "b", "c", "c"}
Dim duplicates = list.Where(Function(x) list.Where(Function(y) x = y).Count() > 1).Distinct()
' duplicates now contains {"a", "c"}

編集:GroupByを使用した代替ソリューション(aquinasに触発された):

Dim duplicates = list.GroupBy(Function(x) x).Where(Function(x) x.Count > 1).Select(Function(x) x.Key)
于 2012-05-31T14:55:01.027 に答える