2014-09-05 66 views
1

我有一个字符串列表,每个字符串的长度都是2个字符。我想对它进行分类。 我首先使用使用LINQ和函数进行自定义排序

.OrderBy(e => e[0]) 

每个字符串的第一个字符列表进行排序,但我的问题是排序第二个字符的时候,是这样的:

.ThenBy(string1 => string1, string2 => string2 Compare(string1,string2) 

我想选择两个字符串,并通他们到我创建的称为比较的函数。

有人可以告诉我怎么做,或者如果有更好的方式做我想做的事吗? 请分享。

public string sortT(string h) 
{ 
    var sortedList = l 
        .OrderBy(e => e[0]) 
        .ThenBy() 
        .ToList<string>(); 
    return sb.ToString(); 
} 
private int Compare(string a, string b) 
{ 
    List<char> value = new List<char>() { 
     '2', '3', '4', '5', '6', '7', '8', '9','J','Q', 'K', 'A' };   
    if (value.IndexOf(a[1]) > value.IndexOf(b[1])) 
     return 1; 
    return -1; 
} 
+6

为什么不'ThenBy(str => str [1])'? – 2014-09-05 07:56:37

+0

,因为[J-A]的ascii值与我所需要的不一样。 'A'被认为是我的问题的最大值,但它的ASCII值是65(小于J = 74)。因此列表指定正确的顺序。 – TheJackal 2014-09-05 07:58:53

+0

一个例子会很有用,因为它不清楚究竟是什么问题或者你想要什么样的顺序。 – 2014-09-05 08:00:36

回答

5

您可以使用您的列表作为基础:

List<char> value = new List<char>() { '2', '3', '4', '5', '6', '7', '8', '9','J','Q', 'K', 'A' }; 

var sortedList = l.OrderBy(str => str[0]) 
        .ThenBy(str => value.IndexOf(str[1])) 
        .ToList<string>(); 

你也可以实现自定义IComparer<T>这样的:

public class TwoCharComparer : IComparer<string> 
{ 
    private static readonly List<char> value = new List<char>() { '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K', 'A' }; 

    public int Compare(string x, string y) 
    { 
     if (x == null || y == null || x.Length < 2 || y.Length < 2) return 0; // ignore 
     int comparison = x[0].CompareTo(y[0]); 
     if (comparison != 0) 
      return comparison; 
     int ix1 = value.IndexOf(x[1]); 
     int ix2 = value.IndexOf(y[1]); 
     if(ix1 == ix2 && ix1 == -1) 
      return x[1].CompareTo(y[1]); 
     else 
      return ix1.CompareTo(ix2); 
    } 
} 

现在可以传递到List.Sort它不需要创建新清单:

var l = new List<string> { "C1", "B2", "A2", "B1", "A1", "C3", "C2" }; 
l.Sort(new TwoCharComparer()); // A1,A2,B1,B2,C1,C2,C3 
+0

太棒了!谢谢你,这件作品完美。但出于好奇,linq是否允许这样做?一次选择两个元素?或者没有必要拥有该功能? – TheJackal 2014-09-05 08:10:47

+0

@TheJackal:你想选择什么?请注意,我编辑了我的答案以提供不同的方法。 – 2014-09-05 08:19:15

+0

非常感谢第二种方法,我知道它将在未来有用。 – TheJackal 2014-09-05 08:23:16

相关问题