我似乎无法理解这一点 我有以下内容:
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} },library
,35
,...
22
但我没有得到预期的结果......
JSON
18
答案 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();