2017-02-18 17 views
2

重複する名前のリストがあり、重複がないリストを取得したい。GroupByを使用してIEnumerableオブジェクトのリストから重複を削除する

CSVCategories = from line in File.ReadAllLines(path).Skip(1) 
          let columns = line.Split(',') 
          select new Category 
          { 
           Name = columns[9] 
          }; 

      var results = CSVCategories.GroupBy(x => x.Name) 
         .Select(g => g.FirstOrDefault()) 
         .ToList(); 

私は、次のループを使用して要素やデバッグを見てみてください、それはまだNULL値に空の文字列を含むリストから重複を返します。

foreach(var item in results) 
{ 
    Console.WriteLine(item.Name); 
} 
+2

関連記事:http://stackoverflow.com/questions/1606679/remove-duplicates-in-the-list-using-linq or http://stackoverflow.com/questions/37850167/delete-duplicates-in- a-list-of-int-arrays/37850231#37850231 –

答えて

0

私はresults変数が重複を含むリストを、私を持ち帰ったことに気づいたが、唯一の彼らのケースで異なっていたという。

など。私の元のリストのCSVCategoriesが要素を含んでいた:[ "ホーム"、 "自宅"、 "をEmptyString"、 "自宅"、 "タウン"、 "タウン"、 "公園"]とき

GROUPBYで解除複製、 resultsクエリーが返されました。 "Home"、 "home"、 "EmptyString"、 "Town"、 "Park"]のようになりました。空の値と異なるケーシングを持つ値を保持する。

ここでは、重複したケーシングと空の文字列を削除する方法を見つける必要があります。

0

LINQのは、決してそれよう不変性を奨励していません入力コレクションを変更します。だから、Distinct()はコレクションのインラインを変更するのではなく、新しいコレクションを返します。試してみてください:

foreach(var item in CSVCategories.Distinct()) 
    { 
     Console.WriteLine(item.Name); 
    } 
+0

foreachループは、デバッグ目的のためのものです。だからあなたは別のリストを取得するために、ループ内の新しいリストにアイテムを追加する必要があると思いますか? – naz786

+0

はい。 Distinct()の結果を変数(新しいものまたは既存のもの)に代入すると、ユニークなコレクションが得られます。 – stt106

1

をごCategoryクラスに等しいとGetHashCodeメソッドの適切な実施を持っていないので、ほとんどの場合は動作しません明確な呼び出し。

2つのオプションがあります。 EqualsメソッドとGetHashCodeメソッドを適切に上書きするか、Hashsetを使用してNameがまだ追加されていないかどうかを確認します。

var uniqueNames = new Hashset<string>(); 

// Original select statement 

CSVCategories = CSVCategories.Where(x => uniqueName.Add(x.Name)).ToList(); 
+0

'let columns = line.Split( '、')'は 'columns'が' string [] 'なので、' columns [9] 'は' string'であることを示唆しています。 – stt106

+0

新しいカテゴリ{名前=列[9]]を選択するのを忘れました –

関連する問題