2017-02-18 238 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(); 

我嘗試看看使用下面的循環中的元素和調試,但它仍然從列表中返回重複的,包括空值空字符串:

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

Related posts:http://stackoverflow.com/questions/1606679/remove-duplicates-in-the-list-using-linq或http://stackoverflow.com/questions/37850167/delete-duplicates-in- a-list-of-int-arrays/37850231#37850231 –

回答

0

我注意到results變量把我帶回包含重複的列表,但只有在他們的外殼不同。

E.g.我原來的名單CSVCategories包含的元素:[ 「家」, 「家」, 「EmptyString」, 「家」, 「城」, 「城」, 「公園」]

用的GroupBy當去複製, results查詢返回[「家」,「家」,「EmptyString」,「城市」,「公園」],所以這種工作。保持空的值和具有不同套管的值。

現在我需要找到一種方法來刪除外殼重複項和空字符串。

0

LINQ的鼓勵不變性所以它永遠不會修改您的輸入集合。所以Distinct()返回一個新的集合,而不是內聯修改集合。嘗試:

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

foreach循環僅用於調試目的。那麼你認爲我應該將這些項目添加到循環中的新列表中以獲得清晰的列表嗎? – naz786

+0

是的。如果將Distinct()的結果分配給一個變量(新變量或現有變量),您將得到一個唯一的集合。在調用Distinct()之前,無需調用ToList() – stt106

1

鮮明的調用不工作很可能是因爲您的類別類不具有的Equals和GetHashCode的正確實施。

您有兩種選擇。正確地覆蓋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

你忘了選擇新的類別{Name = columns [9]} –