2012-05-20 128 views
1

我正在寻找一种有效的方式来将数组/列表“链接”到彼此,并根据其中一个数组同步排列所有列表/数组。C#清单列表 - 排序

例如可以说我有三个列表:

List<double> Data1; 
List<double> Data2; 
List<double> Data3; 

名单内的项目显然不是结构相关,但我希望他们能。例如Data1 [0],Data2 [0]和Data3 [0]是相关的。

所以现在我想根据Data1从最大到最小排序三个列表的集合。我如何做到这一点,以便所有三个列表保持同步?

非常感谢您的帮助!

+0

请出示一些源代码...你有什么尝试?什么不工作? – Yahia

+0

我还没有尝试过任何东西,因为我不知道从哪里开始!我读了很多文章,但似乎无法获得我需要的那种功能。我认为我的要求是非常基本的,所以不知道为什么我找不到相关信息 – user1035217

回答

1

我会创建一个从所有三个各自的列表结合值加在一起,那种基于所需的字段匿名类型的列表,然后项目排序值回各自的列表:

var combined = 
    Enumerable.Range(0, Data1.Count) 
       .Select(i => new 
       { 
        Item1 = Data1[i], 
        Item2 = Data2[i], 
        Item3 = Data3[i], 
       }) 
       .OrderBy(c => c.Item1) 
       .ToList(); 

Data1 = combined.Select(c => c.Item1).ToList(); 
Data2 = combined.Select(c => c.Item2).ToList(); 
Data3 = combined.Select(c => c.Item3).ToList(); 
+0

谢谢,我从这段代码中学到了很多东西 – user1035217

1

您可以使用Zip到阵列绑在一起,然后用投影类型由一个特定的点订购:

List<double> Data1; 
List<double> Data2; 
List<double> Data3; 

var orderedByDataOne = Data1 
    .Zip(Data2, (one, two) => new {one, two}) 
    .Zip(Data3, (zipped, three) => new {zipped.one, zipped.two, three}) 
    .OrderBy(x => x.one) 
+0

有趣的代码会去尝试一下,谢谢! – user1035217

5

使结构相关的项目:有一个List<Data>

public class Data { 
    public double Data1 { get; set; } 
    public double Data2 { get; set; } 
    public double Data3 { get; set; } 
} 

,您可以轻松地对物品之一进行分类:

theList.Sort((x, y) => x.Data2.CompareTo(y.Data2)); 
+0

嘿,这将最适合我的应用程序。非常感谢! – user1035217

+0

@ user1035217:这也是代码可维护性的最佳设计。 – Douglas

+0

绝对如此。如果它们应该在结构上相关,那么把它们联系起来。此外,类Data可以实现IComparable作为排序的替代方法...虽然我喜欢这里的Lambda方法。 – KennyZ