gpt4 book ai didi

c# - 根据另一个列表<>排序

转载 作者:太空宇宙 更新时间:2023-11-03 17:08:31 26 4
gpt4 key购买 nike

说我有

List<int> ages  = new List<int>() { 8, 5, 3, 9, 2, 1, 7 };
List<int> marks = new List<int>() { 12, 17, 08, 15, 19, 02, 11 };

我可以像这样按年龄对我的标记进行排序:

while (true)
{
bool swapped = false;

for (int i = 0; i < ages.Count - 1; i++)
if (ages[i] > ages[i + 1])
{
int tmp = ages[i];
ages[i] = ages[i + 1];
ages[i + 1] = tmp;

tmp = marks[i];
marks[i] = marks[i + 1];
marks[i + 1] = tmp;

swapped = true;
}

if (!swapped)
break;
}

现在我想把它放入一个接受任意两个列表的函数中。第一个参数将是引用列表、数字或可比较列表。第二个参数将是包含数据的列表。

例如:

public static void Sort<T>(List<T> RefList, List<T> DataList)
{
// sorting logic here...
}

有几个问题:

首先,T几乎可以肯定不是RefListDataList中的同一类型。 RefList 可能是日期、整数或 double ;而 DataList 可以是任何东西。我需要能够接收两个任意泛型类型。

其次,我似乎无法在这一行中将 > 运算符与 T 一起使用:

if (ages[i] > ages[i + 1])

也许我的整个方法是错误的。

顺便说一下,我已经阅读了对类似问题的回复,这些回复建议两个列表应该组合成一个复合数据类型的列表。这对我的应用程序来说根本不实用。我想做的就是编写一个静态函数,以某种方式根据另一个列表的元素对一个列表进行排序。

最佳答案

要按照您希望的方式对一个列表进行排序,您实际上需要以某种方式将第一个列表中的项目的引用保留到第二个列表中的权重/键。没有现有的方法可以做到这一点,因为您不能轻易地将元数据与任意值相关联(即,如果第一个列表是 int 的列表,就像您的情况一样,没有任何内容可以映射到第二个列表中的键)。您唯一合理的选择是同时对 2 个列表进行排序并按索引进行关联 - 同样没有现有的类可以提供帮助。

使用您拒绝的解决方案可能会容易得多。 IE。只需 Zip 和 OrderBy,而不是重新创建第一个列表:

ages = ages
.Zip(marks, (a,m)=> new {age = a; mark = m;})
.OrderBy(v => v.mark)
.Select(v=>v.age)
.ToList();

注意(由 phoog 提供):如果您需要使用 Array 进行此类排序,可以使用 Array.Sort完全允许此操作(有关详细信息,请参阅 phoog 的回答)。

关于c# - 根据另一个列表<>排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14227757/

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