我正在尝试使用以下代码从单词数组中获取不同的单词列表:
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'的两次出现,但它会返回一个短语中每个单词的列表。
有人可以建议我如何获得一份清晰的清单吗?感谢
戴夫
答案 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();