2015-04-06 174 views
1

我已经看到了这个问题,但我没有找到我的幸福与答案...至少一个对象必须实现IComparable调用的OrderBy()

我试图做到这一点:

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

抛出一个错误:

At least one object must implement IComparable.

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

List<string> categories = new List<string>();  
var coll = JsonConvert.DeserializeObject<ObservableCollection<ArticleJSON>>(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<string> tags { get; set; } 
+4

编译器不知道如何比较标签..什么是标签数据类型? – 2015-04-06 03:55:31

+0

向我们显示您的数据! – 2015-04-06 03:56:07

+0

为标签的类型 – bit 2015-04-06 03:56:39

回答

5

要订购一套东西,必须有一种方法来比较两件事情,以确定哪一件更大或更小,或者它们是否相等。任何实现IComparable接口的c#类型都提供了将其与另一个实例进行比较的方法。您的tags字段是字符串列表。没有标准的方式来以这种方式比较两个字符串列表。 List<string>类型不实现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<List<string>> 
{ 
    // implementation 
} 

,并使用它像这样:

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

实现接口IComparable感谢您的回答! – 2015-04-06 04:33:49

0

ArticleJSON没有实现IComparable而字符串中。编译器不知道如何比较您调用的OrderBy()的ArticleJSON。正因为如此,使用字符串列表时它工作正常。

相关问题