列表.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 + " ,");
}

列表.orderbydowndownlinq不工作

如果你仔细想想,这真的很简单:

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