2015-04-06 98 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。正因爲如此,使用字符串列表時它工作正常。

相關問題