使用linq对列表进行排序和匹配

时间:2011-11-09 08:31:36

标签: linq

我有两张清单。

List A      List B
  a          10
  b           5
  c          20

我必须对列表B 升序进行排序。 根据列表B,列表A也应重新排序。所以我的结果将是这样的

List A      List B
 c          20
 a          10
 b          5

我在这里使用Linq(orderby)。面对排序其他列表的问题。我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

一种方法是

List<string> listA = new List<string> { "a", "b", "c" };
List<int> listB = new List<int> { 10, 5, 20 };

var joined = listA.Select((value, index) => Tuple.Create(value, listB[index]));

List<string> orderedListA = joined.OrderByDescending(t => t.Item2)
                                  .Select(t => t.Item1)
                                  .ToList();

编辑:我错过了Zip方法。这条线

 var joined = listA.Select((value, index) => Tuple.Create(value, listB[index]));

可以写成

 var joined = listA.Zip(listB, (s,i) => Tuple.Create(s,i));

答案 1 :(得分:1)

如何使用Zip运算符:

List<char> unsortedA = ...
List<int> unsortedB = ...

var orderedTuples = unsortedA.Zip(unsortedB, Tuple.Create)
                             .OrderByDescending(tuple => tuple.Item2)
                             .ToList();

// If required:
var sortedA = orderedTuples.ConvertAll(tuple => tuple.Item1);
var sortedB = orderedTuples.ConvertAll(tuple => tuple.Item2);

另一方面,看起来您应该使用元组类型将字符和索引存储在一起,而不是基于索引“关联”它们。

答案 2 :(得分:1)

使用.Net 4.0 Zip和匿名类型

b.Zip(a, (x,y)=>new {Key=x, Value=y}).
  OrderBy(x=>x.Key).
  Select(x=>x.Value).
  ToList()