2017-02-18 200 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]} –