至少有一个对象必须实现IComparable调用OrderBy()

我已经看到了这个问题,但我没有找到答案中的快乐……

我想这样做:

var coll = JsonConvert.DeserializeObject<ObservableCollection>(json); coll = coll.OrderBy(a => a.tags).Distinct().ToList(); 

引发错误:

至少有一个对象必须实现IComparable。

目前我没有找到解决方案,所以我这样做:

 List categories = new List(); var coll = JsonConvert.DeserializeObject<ObservableCollection>(json); for (int i = 0; i < test.Count; ++i) { for (int j = 0; j < test[i].tags.Count; ++j) { _categories.Add(test[i].tags[j]); } } categories = _categories.Distinct().ToList(); 

它有效,但我很想知道为什么第一个不起作用。

编辑:

我的数据来自JSON:

  'tags': [ 'Pantoufle', 'Patate' ] }, public List tags { get; set; } 

要订购一组东西,必须有一种方法来比较两件事来确定哪一件更大或更小,或者它们是否相等。 任何实现IComparable接口的c#类型都提供了将其与另一个实例进行比较的方法。

您的tags字段是字符串列表。 没有标准的方法来以这种方式比较两个字符串列表。 类型List不实现IComparable接口,因此不能在LINQ OrderBy表达式中使用。

例如,如果您想按标签数量订购文章,您可以这样做:

 coll = coll.OrderBy(a => a.tags.Count).ToList(); 

因为Count将返回一个整数,并且整数具有可比性。

如果您想按排序顺序获取所有唯一标记,可以这样做:

 var sortedUniqueTags = coll .SelectMany(a => a.Tags) .OrderBy(t => t) .Distinct() .ToList(); 

因为字符串是可比的。

如果你真的知道如何比较两个字符串列表,你可以编写自己的自定义比较器:

 public class MyStringListComparer : IComparer> { // implementation } 

并像这样使用它:

 var comparer = new MyStringListComparer(); coll = coll.OrderBy(a => a.tags, comparer).Distinct().ToList(); 

在String的情况下,ArticleJSON不实现IComparable。 编译器不知道如何比较您正在调用的OrderBy()的ArticleJSON。 因此,当你使用字符串列表时,它工作正常。