我有以下列表:
List<char[]> list1 = new List<char[]>();
我需要对它们上的所有 char[]
元素进行排序。如果我使用list1.Sort()
它表示它无法比较元素,任何想法如何对其进行排序?
我确实需要列表为char[]
而不是string
。
答案 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方法重写为您自己的比较机制