Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 至少有一个对象必须实现IComparable调用OrderBy()_C#_Linq_Json.net - Fatal编程技术网

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

C# 至少有一个对象必须实现IComparable调用OrderBy(),c#,linq,json.net,C#,Linq,Json.net,我已经看到了这个问题,但我没有找到答案的快乐 我正试图做到这一点: var coll = JsonConvert.DeserializeObject<ObservableCollection<ArticleJSON>>(json); coll = coll.OrderBy(a => a.tags).Distinct().ToList(); var coll=JsonConvert.DeserializeObject(json); coll=coll.OrderBy

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

我正试图做到这一点:

var coll = JsonConvert.DeserializeObject<ObservableCollection<ArticleJSON>>(json);
coll = coll.OrderBy(a => a.tags).Distinct().ToList();
var coll=JsonConvert.DeserializeObject(json);
coll=coll.OrderBy(a=>a.tags).Distinct().ToList();
抛出一个错误:

必须至少有一个对象实现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();
列表类别=新列表();
var coll=JsonConvert.DeserializeObject(json);
对于(int i=0;i
它是有效的,但我很好奇为什么第一个不起作用

编辑:

我的数据来自JSON:

            'tags': [ 

                                        'Pantoufle',
                                        'Patate'
                                     ]
                            },
            public List<string> tags { get; set; }
“标记”:[
“Pantoufle”,
“帕塔特”
]
},
公共列表标记{get;set;}

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

要对一组内容进行排序,必须有一种方法来比较两个内容,以确定哪一个更大或更小,或者它们是否相等。实现
IComparable
接口的任何c#type都提供了将其与另一个实例进行比较的方法

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

例如,如果您想按标签的数量订购物品,您可以这样做:

coll = coll.OrderBy(a => a.tags.Count).ToList();
var sortedUniqueTags = coll
    .SelectMany(a => a.Tags)
    .OrderBy(t => t)
    .Distinct()
    .ToList();
var comparer = new MyStringListComparer();
coll = coll.OrderBy(a => a.tags, comparer).Distinct().ToList();
因为
Count
将返回一个整数,并且整数是可比较的

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

coll = coll.OrderBy(a => a.tags.Count).ToList();
var sortedUniqueTags = coll
    .SelectMany(a => a.Tags)
    .OrderBy(t => t)
    .Distinct()
    .ToList();
var comparer = new MyStringListComparer();
coll = coll.OrderBy(a => a.tags, comparer).Distinct().ToList();
因为字符串是可比较的

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

public class MyStringListComparer : IComparer<List<string>>
{
    // implementation
}

编译器不知道如何比较标记。。什么是
标记
数据类型?为标记的类型实现接口IComparable为标记的类型实现接口IComparable——这不是一个有用的注释,因为标记的类型是
列表
!否。OP正在比较标签,这些标签是
列表
。列表(与其内容相反)没有定义的顺序;不起作用,但当我像.OrderBy(rr=>rr.xa).ThenBy(rr=>rr.xb.ToList())那样分离它们时,它就起作用了;仍然不知道为什么前者不起作用。