none
Linqで重複した要素を得るには RRS feed

  • 質問

  • 配列{0,1,2,3,1}では「1」が重複していますが、この「1」という要素を取得するには
       Dim ary As Integer() = {0, 1, 2, 3, 1}
       For i As Integer = 0 To ary.Length - 1
             For j As Integer = i + 1 To ary.Length - 1
                   If ary(i) = ary(j) Then
                        'ary(i)が重複要素
                   End If
              Next
       Next
    ですが、Linqで取得できますか。
    宜しくお願いします。
    2018年10月7日 0:02

回答

  • Dim hs As New HashSet(Of String)
    Dim trimmed As New List(Of HistoryItem)
    For Each item In histories
        If hs.Add(item.FileName) Then
            trimmed.Add(item)
        End
    Next
    個人的にはこんな感じで済ませますね。
    • 回答としてマーク nebokken 2018年10月7日 3:40
    2018年10月7日 2:35
  • もともとは {0,1,2,3} で、追加されるのは {1} というように、重複するのは1箇所だけの設定になります。

    {0,1,2,3,2,3} のように、重複が2箇所になることはない設定です。

    この条件なら、単に最後の1を追加する時に元リストに存在しているかどうか判定するだけのような。

    • 回答としてマーク nebokken 2018年10月7日 4:10
    2018年10月7日 4:00

すべての返信

  • 目的は何でしょう?

    もし最終的な目的が重複を排除したいということであれば Distinct メソッドというものがありますが・・・

    そういう話ではなく、単純に重複要素を知りたいということでしたら失礼しました。


    • 編集済み SurferOnWww 2018年10月7日 1:08 誤字訂正
    2018年10月7日 1:07
  • Distinctを使用します。
    2018年10月7日 1:07
  • Distinctメソッドの紹介サイトはいっぱいありますが、何故か重複要素を得る紹介サイトはありません。
    2018年10月7日 1:28
  • 得たい動作の仕様をもっと精密に説明すべきです。

    {0, 1, 2, 3, 1, 5, 4, 3, 7, 3}に対して、欲しいのは

    {1, 3}ですか?

    {1, 3, 1, 3, 3}ですか?

    {1, 1, 3, 3, 3}ですか?

    それとも、

    {1, 3, 4, 7, 9}(インデックス番号の一覧)ですか?

    2018年10月7日 1:36
  • > Distinctメソッドの紹介サイトはいっぱいありますが、何故か重複要素を得る紹介サイトはありません。

    「目的は何でしょう?」とお尋ねしていますが、答えられない事情がありますか?

    2018年10月7日 1:45
  • ちょっと、長くなりますが、最近使用したファイル10個を表示させようと考え、xmlファイルをよく使うようだとあるサイトで見ました。「設定」(My.Settings)のほうが簡単そうだとはおもったのですが、xmlも勉強しようとしてチャレンジしています。

    xmlには<datetime></datetime><filepath></filepath>で記憶しておくことにしました。

    <datetime>は必要ないかなと今は思ってますが…。

    こぎ出した船ですので、以下簡略的に書きます。

    9月10日 test1.txt

    9月11日 test2.txt

    9月12日 test3.txt

    9月13日 test1.txt

    となった場合、最近使用したファイルは

    新しい順に  test1.txt , test3.txt , test2.txtとなり、9月10日のtest1.txtのインデックスを取得して古い方を削除しようと考えました。そのために必要だったのですが、回り道していますかね。

    2018年10月7日 2:06
  • Dim hs As New HashSet(Of String)
    Dim trimmed As New List(Of HistoryItem)
    For Each item In histories
        If hs.Add(item.FileName) Then
            trimmed.Add(item)
        End
    Next
    個人的にはこんな感じで済ませますね。
    • 回答としてマーク nebokken 2018年10月7日 3:40
    2018年10月7日 2:35
  • > 回り道していますかね。

    質問者さんが個人的にいろいろ試行錯誤して回り道になるのは勉強のためということもあって普通のこととは思いますが、このフォーラムの一般閲覧者・回答者には回り道にならないような(時間と労力の無駄にならないような)配慮をお願いします。

    最初から適切な情報が提供されていれば、閲覧者・回答者が質問者さんの状況を的確に把握でき、タイムリーで的を得た回答が得られるということで、質問者さんにもメリットがあります。ガイドラインも出ていますので目を通していただければと思います。
     
    フォーラムのご利用方法(質問の投稿)について
    https://social.msdn.microsoft.com/Forums/ja-JP/b2074c04-2e91-414d-8e9e-d634be311e31

    2018年10月7日 2:46
  • もともとは {0,1,2,3} で、追加されるのは {1} というように、重複するのは1箇所だけの設定になります。

    {0,1,2,3,2,3} のように、重複が2箇所になることはない設定です。

    2018年10月7日 3:12
  • HashSet は始めて知りました。走り読みでしたが、 HashSetを少し理解し試してみました。
    9月10日 test1.txt
    9月11日 test2.txt
    9月12日 test3.txt
    に test1.txt を追加しようとしても、追加できない。つまり、test1.txt が重複しているということだったのですね。
    Linkではないですけど、元々の目的は達成されそうです。皆さん、質問の意図が曖昧でご迷惑をおかけしました。申し訳ありませんでした。
    2018年10月7日 3:41
  • もともとは {0,1,2,3} で、追加されるのは {1} というように、重複するのは1箇所だけの設定になります。

    {0,1,2,3,2,3} のように、重複が2箇所になることはない設定です。

    この条件なら、単に最後の1を追加する時に元リストに存在しているかどうか判定するだけのような。

    • 回答としてマーク nebokken 2018年10月7日 4:10
    2018年10月7日 4:00
  • 猪突猛進してしまいました。その通りです。申し訳ありません。
    2018年10月7日 4:14