2017-03-12 30 views
0

我已经整理用下面的代码tuplelist排序列表与

// for loop code 
{ 

list.Add(new Tuple(log[0], "arr")); 

list.Add(new Tuple(log[ 1 ], "dep")); 
} 

// sorts the list 

list.Sort((a, b) => a.Item1.CompareTo(b.Item1)); 

排序后重复值,并根据优先级标记顺序,它看起来像这样

enter image description here

在重复值的情况下, ,我想基于标签优先级对列表进行排序,例如'arr'应该比'dep'更具优先级,并且应该像这样来。

enter image description here

如何在C#中执行此操作?

回答

1

你只需要到逻辑添加到您的比较:

list.Sort((a, b) => 
{ 
    int result = a.Item1.CompareTo(b.Item1); 

    return result == 0 ? a.Item2.CompareTo(b.Item2) : result; 
}); 

换句话说,如果Item1性能的比较结果为相等,则比较Item2值和返回的结果来代替。否则返回原始结果。

请注意,此示例利用了您希望优先考虑的值自然按您想要的顺序排序的事实,因为词汇"arr"出现在"dep"之前。

使用Sort()方法是最有效的。但是你可以通过使用LINQ来提高代码的表现力。像这样:

list = list.OrderBy(x => x.Item1).ThenBy(x => x.Item2).ToList(); 

这将导致额外的内存分配,但对我来说更具可读性。有关更多示例,请参阅Sorting array by multiple key values

+0

如果它们在词汇上没有优先级,例如,而不是“arr”,那么它是“开始”并且“dep”是“结束”。 – Kanvas

+0

@Kanvas:只要_consistently_有序,就可以颠倒顺序。例如。使用'ThenByDescending()'而不是'ThenBy()',或者在第一个例子中,在返回之前保存'Item2'比较结果,并返回'-1'为正值,'1'为负值(do_not_屈从于仅仅否定结果的诱惑......如果需要,实际比较可以返回“int.MinValue”,否定依然会给你一个负值,即再次为“int.MinValue”)。 –