gpt4 book ai didi

C# LINQ OrderBy 来自另一个列表的值 (IEnumerable)

转载 作者:行者123 更新时间:2023-12-02 01:43:31 24 4
gpt4 key购买 nike

假设我们有一个字符串列表 var listA = new List<string> {"B", "C", "A"} ,并以所需的方式排序。并且,有一个定义如下的对象:

public class Sample {
public string Letter {get;set;} // "A","B","C","D","#"
public string Number {get;set;} // not relevant
}

此外,还有另一个列表,List<Sample> listB ,并且我想以首先出现字母值“B”的对象,然后是“C”,最后是“A”的方式对它进行排序,以便遵循与 listA 中相同的顺序。有任何想法吗? :)

编辑:Letter 属性可以包含更广泛的字符,与 listA 不同,listA 只能包含 3 个字符。预期顺序“B”、“C”、“A”...“其余所有,顺序不相关”

最佳答案

假设Letter的值在listA内。如果假设不正确,则值得考虑重新设计算法。这可能取决于超出范围的预期订单的要求。

   var sortedSamples = listB.OrderBy(x=>listA.IndexOf(x.Letter));

为了获得更好的性能,请将订单缓存到字典中:

   var orders = new Dictionary<string, int>();
for (int i = 0; i < listA.Count; i++)
{
orders.Add(listA[i], i);
}
var sortedSamples = listB.OrderBy(x=>orders[x.Letter]);

如果Letter的可能取值范围远小于listA,那么更好的构造orders如下:

   foreach (string letter in listB.Select(x=>x.Letter))
{
orders.Add(letter, listA.IndexOf(letter));
}

更新

如果字母'范围超出listA,并且由于OP希望超出的字母位于末尾:

   var orders = new Dictionary<string, int>();
for (int i = 0; i < listA.Count; i++)
{
orders.Add(listA[i], i);
}
int lastIndex = listA.Count;
foreach (string letter in listB.Select(x=>x.Letter)
.Distinct().Except(listA))
{
orders.Add(letter, lastIndex);
}

关于C# LINQ OrderBy 来自另一个列表的值 (IEnumerable),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71238632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com