使用LINQ从数组中选择不同的单词列表

时间:2010-02-14 00:12:00

标签: c# linq distinct

我正在尝试使用以下代码从单词数组中获取不同的单词列表:

string words = "this is a this b";

var split = words.Split(' ');

IEnumerable<Word> distinctWords = (from w in split
                          select new Word
                                     {
                                         Text = w.ToString()
                                     }
                         ).Distinct().ToList();

我认为这会消除'this'的两次出现,但它会返回一个短语中每个单词的列表。

有人可以建议我如何获得一份清晰的清单吗?感谢

戴夫

5 个答案:

答案 0 :(得分:23)

在您的示例中,每个Word对象都是不同,因为没有比较查看Text属性。

但是,没有理由创建新对象:

var distinctWords = (from w in split 
                      select w).Distinct().ToList(); 

或更简单:

var distinctWords = new List<string>(split.Distinct());

答案 1 :(得分:1)

您尚未发布Word课程的代码,但我的猜测是它没有通过值比较实现Equals,因此您获得了Equals的默认实现它只是检查对象引用。请注意,如果您决定实施自己的Equals版本,则还需要正确实施GetHashCode

解决此问题的另一种方法是提供IEqualityComparer作为Distinct函数的参数。

答案 2 :(得分:1)

问题是,您创建了几个包含相同值的Word对象,但编译器应该如何知道这些对象应该是相同的?

尝试

(from w in split.Distinct()
select new Word { Text = w.ToString()}).ToList();

答案 3 :(得分:0)

正如其他人所说,问题可能是你的Word对象没有实现结构相等(比较实际内容,而不是实例引用)。如果您仍希望获得Word个对象的集合,但对基础字符串值使用Distinct,则可以写下:

IEnumerable<Word> distinctWords = 
   (from w in split.Distinct() 
    select new Word { Text = w.ToString() }).ToList(); 

答案 4 :(得分:0)

您可以在调用.Distinct()之前先尝试将数组转换为ToList() 然后再次将其转换为ToArray()

myArray= myArray.ToList().Distinct().ToArray();