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

标签 c# list generics sorting

说我有

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/

相关文章:

c# - 将单选按钮添加到 Windows 窗体数据网格控件

javascript - 如何从数组中提取图像并将其放入列表中

android - 从 Moshi 类型适配器的具体泛型类型中获取 ParameterizedType

java - 模板和泛型。为什么我可以在 C++ 中执行以下操作,但不能在 Java 中执行?我该如何克服这个问题?

java - 现实生活中的通用类示例

c# - 在实体中正确创建导航类

c# - 使用持久连接客户端的 SignalR 示例?

条件语句中的 C# 6.0 空运算符

swift - swiftUI 下拉刷新数据

list - 在 Scala 中以恒定时间连接列表?