使用数组</object>对列表<object>进行排序

时间:2013-10-07 12:09:42

标签: c# winforms list sorting

我似乎无法理解这一点 我有以下内容:

private String[] PREFERED = new String[] { "37", "22", "18" };

    private List<Stream> library;

    public class Stream
    {
        public String ID { get; set; }
        public String URL { get; set; }
        public String Description { get; set; }
        public String Type { get; set; }
    }

我想使用List<Stream>字符串数组对名为library的{​​{1}}进行排序,以便我的结果为PREFERED,其顺序如下:{{1} },library35,...

22

但我没有得到预期的结果......

JSON

18

3 个答案:

答案 0 :(得分:1)

我尝试在Linqpad中使用代码,它对我有用:

void Main()
{
String[] PREFERED = new String[] { "37", "22", "18" };
List<Stream> library =  new  List<Stream> () ;
library.Add (new Stream () {ID ="22" }) ;
library.Add (new Stream () {ID ="37" }) ;
library.Add (new Stream () {ID ="18" }) ;
library.Dump () ;
library.OrderBy(o => Array.IndexOf(PREFERED, o.ID)).ToList().Dump () ;

}

public class Stream
{
    public String ID { get; set; }
    public String URL { get; set; }
    public String Description { get; set; }
    public String Type { get; set; }
}

答案 1 :(得分:1)

我认为即使PREFERED不包含library中的ID,情况也会有效。

var ranks =
    PREFERED
        .Select((x, n) => new { x, n })
        .ToLookup(xn => xn.x, xn => xn.n);

library =
    library
        .OrderBy(l =>
            ranks[l.ID]
                .DefaultIfEmpty(int.MaxValue)
                .First())
        .ToList();

以下是根据请求提出的解释说明。

.Select((x, n) => new { x, n })将值序列投影到序列中的值序列及其索引中。

.ToLookup(xn => xn.x, xn => xn.n)将序列更改为类似字典的结构,该结构从提供的任何键返回零个或多个值的列表,无论该键是否在原始序列中。如果密钥不在原始序列中,则会返回一个空值序列。

表达式ranks[l.ID]获取library序列中的每个id并应用查找,返回一系列值。表达式.DefaultIfEmpty(int.MaxValue)确保序列至少有一个值,表达式.First()返回序列的第一个值。因此,这确保了library源中的永久ID,您可以获得PREFERED序列中可能的匹配索引值,如果ID不在int.MaxValue序列中,则可以PREFERED

然后,通过返回的值排序并使用.ToList()重新创建列表是一件简单的事。

答案 2 :(得分:0)

看起来好像你只是希望它们按照ID字段的降序排列,为什么不这样做

library = library.OrderByDescending(x => Int32.Parse(x.ID)).ToList();