根据另一个列出一个List <>

use*_*358 1 c# sorting generics list

说我有

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 };
Run Code Online (Sandbox Code Playgroud)

我可以在我的排序,marks通过ages这样的:

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;
}
Run Code Online (Sandbox Code Playgroud)

现在我想把它放到一个接受任何两个列表的函数中.第一个参数将是参考列表,数字或可比较列表.第二个参数是包含数据的列表.

例如:

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

有一些问题:

首先,T几乎肯定不是RefListDataList.RefList可能是日期,整数或双打; 而DataList可以完全免费.我需要能够接收两个任意泛型类型.

其次,我似乎无法使用此行中的>运算符T:

if (ages[i] > ages[i + 1])
Run Code Online (Sandbox Code Playgroud)

也许我的整个方法都是错的.

顺便说一下,我已经读过类似问题的回答,这些问题表明两个列表应该合并为一个复合数据类型的列表.这对我的应用来说根本不实用.我想要做的就是编写一个静态函数,以某种方式根据另一个列表的元素对一个列表进行排序.

Ale*_*kov 8

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

使用您拒绝的解决方案可能要容易得多.即简单的Zip和OrderBy,而不是重新创建第一个列表:

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

注意(由phoog提供):如果你需要使用Array进行这种类型的排序,那么Array.Sort可以准确地进行这种操作(详情请参阅phoog的答案).


pho*_*oog 8

没有框架方法可以做到这一点List<T>,但如果你不介意将数据放入两个数组,你可以使用一个带有Array.Sort()两个数组作为参数的重载.第一个数组是键,第二个是值,因此您的代码可能如下所示(不考虑从列表中获取数组的步骤):

Array.Sort(ages, marks);
Run Code Online (Sandbox Code Playgroud)

将值转换为数组然后返回列表的具体细节将取决于您是否需要最终使用相应的列表进行适当排序,或者是否可以按所需顺序返回包含数据的新列表.