如何对char []列表进行排序?

时间:2014-12-12 13:54:31

标签: c# .net arrays list sorting

我有以下列表:

List<char[]> list1 = new List<char[]>();

我需要对它们上的所有 char[] 元素进行排序。如果我使用list1.Sort()它表示它无法比较元素,任何想法如何对其进行排序?

我确实需要列表为char[]而不是string

3 个答案:

答案 0 :(得分:7)

如果您希望char[]具有排序为string的确切行为,则可以执行以下操作:

list1 = list1.OrderBy(x => new string(x)).ToList();

答案 1 :(得分:5)

您也可以根据需要使用List.Sort

list1.Sort((chars1, chars2) => new string(chars1).CompareTo(new string(chars2)));

这不需要创建新列表。

另一种方法是为IComparer<T>实施自己的Char[]。这应该工作,虽然它肯定是可以改进和未经测试的。相关部分是Compare方法:

public class CharArrayComparer : IComparer<Char[]>, IEqualityComparer<Char[]>
{
    public CharArrayComparer() : this(false) {  }
    public CharArrayComparer(bool ignoreCase)
    {
        IgnoreCase = ignoreCase;
    }
    public bool IgnoreCase { get; set; }

    public int Compare(char[] x, char[] y)
    {
        if (x == null && y != null) return -1;
        if (y == null && x != null) return 1;
        if (y == null && x == null) return 0;
        int minLength = Math.Min(x.Length, y.Length);
        for(int i = 0; i < minLength; i++)
        {
            char c1 = IgnoreCase ? char.ToUpperInvariant(x[i]) : x[i];
            char c2 = IgnoreCase ? char.ToUpperInvariant(y[i]) : y[i];
            if (c1 < c2) return -1;
            else if (c2 < c1) return 1;
        }
        return 0;
    }

    public bool Equals(char[] x, char[] y)
    {
        if (x == null || y == null) return false;
        if (x.Length != y.Length) return false;
        for (int i = 0; i < x.Length; i++)
        {
            char c1 = IgnoreCase ? char.ToUpperInvariant(x[i]) : x[i];
            char c2 = IgnoreCase ? char.ToUpperInvariant(y[i]) : y[i];
            if (c1 != c2) return false;
        }
        return true;
    }

    public int GetHashCode(char[] chars)
    {
        if(chars == null) return 0;
        int hash = 17;
        unchecked
        {
            foreach (char c in chars)
            {
                if(IgnoreCase)
                    hash = hash * 31 + char.ToUpperInvariant(c).GetHashCode();
                else
                    hash = hash * 31 + c.GetHashCode();
            }
        }
        return hash;
    }
}

List.Sort或许多LINQ扩展方法中使用方便:

list1.Sort(new CharArrayComparer());

答案 2 :(得分:0)

使用 List.Sort()列表元素应可比较(实现类似的界面) 因此,如果您有特殊的比较,我更喜欢为元素创建一个新类,并实现Comparable Interface并将CompareTo方法重写为您自己的比较机制