列表.orderbydowndownlinq不工作
本文关键字:工作 orderbydowndownlinq 列表 | 更新日期: 2023-09-27 17:52:59
请查看下面的代码,我需要在OrderedListDesc ={7,6,5,4,1,2,3,8,9}中输出,而不是{4,5,6,7,1,2,3,8,9}。
List<long> List = new List<long>() { 1,2,4,5,3,8,6,7,9 };
List<long> ListAsc = new List<long>() { 4,5,6,7 };
List<long> ListDesc = new List<long>() { 7,6,5,4 };
var OrderedListAsc = List.OrderBy(b => ListAsc.FindIndex(a => a == b)).ToList();
foreach (var l in OrderedListAsc)
{
Console.Write(l+" ,");
}
Console.WriteLine();
var OrderedListDesc = List.OrderByDescending(b => ListDesc.FindIndex(a => a == b)).ToList();
foreach (var l in OrderedListDesc)
{
Console.Write(l + " ,");
}
如果你仔细想想,这真的很简单:
在ListDesc
中发现的元素的顺序应该是数字本身,然后你得到你的结果:
var OrderedListDesc = List.OrderByDescending(b => ListDesc.Any(a => a == b) ? b : 0).ToList();
foreach (var l in OrderedListDesc)
{
Console.Write(l + " ,");
}
如果你想看看发生了什么,也就是说,为什么你得到错误的顺序,运行这个:
foreach (var i in List)
{
Console.WriteLine("{0}, {1}", i, ListDesc.FindIndex(a => a == i));
}
无论如何也不需要ListDesc
。请使用ListAsc
:
var OrderedListDesc = List.OrderByDescending(b => ListAsc.FindIndex(a => a == b)).ToList();
或者,使用ListDesc
并调用OrderBy
而不是OrderByDescending
:
var OrderedListDesc = List.OrderBy(b => ListDesc.FindIndex(a => a == b)).ToList();
如果您注意到这个问题是,当一个元素(值)没有找到FindIndex
返回-1
,它将按顺序首先出现。当没有找到元素时,赋最大值。
var OrderedListDesc = List.OrderBy(b =>
{
var index = ListDesc.FindIndex(a => a == b);
return index==-1? int.MaxValue : index;
}).ToList();
一个小提示(与问题无关),如果您想打印,
分隔的值,您可以简单地使用string.Join
,如下所示。
Console.WriteLine(string.Join(",", OrderedListDesc));
输出:7 ,6 ,5 ,4 ,1 ,2 ,3 ,8 ,9 ,
检查Fiddle