Tôi có một danh sách các chuỗi có thể chứa một chữ cái hoặc một chuỗi đại diện của một int (tối đa 2 chữ số). Chúng cần được sắp xếp theo thứ tự bảng chữ cái hoặc (khi nó thực sự là một int) trên giá trị số mà nó đại diện.Sắp xếp các số và chuỗi hỗn hợp
Ví dụ:
IList<string> input = new List<string>()
{"a", 1.ToString(), 2.ToString(), "b", 10.ToString()};
input.OrderBy(s=>s)
// 1
// 10
// 2
// a
// b
Những gì tôi muốn là
// 1
// 2
// 10
// a
// b
Tôi có một số ý tưởng liên quan đến định dạng nó với cố gắng để phân tích nó, sau đó nếu nó là một TryParse thành công để định dạng nó với tôi tùy chỉnh stringformatter để làm cho nó có các số 0 trước đó. Tôi hy vọng cho một cái gì đó đơn giản hơn và performant.
Chỉnh sửa
Tôi đã kết thúc việc tạo IComparer I được bán trong thư viện Utils để sử dụng sau này.
Trong khi tôi đang ở đó, tôi đã ném đôi trong hỗn hợp quá.
public class MixedNumbersAndStringsComparer : IComparer<string> {
public int Compare(string x, string y) {
double xVal, yVal;
if(double.TryParse(x, out xVal) && double.TryParse(y, out yVal))
return xVal.CompareTo(yVal);
else
return string.Compare(x, y);
}
}
//Tested on int vs int, double vs double, int vs double, string vs int, string vs doubl, string vs string.
//Not gonna put those here
[TestMethod]
public void RealWorldTest()
{
List<string> input = new List<string>() { "a", "1", "2,0", "b", "10" };
List<string> expected = new List<string>() { "1", "2,0", "10", "a", "b" };
input.Sort(new MixedNumbersAndStringsComparer());
CollectionAssert.AreEquivalent(expected, input);
}
tuyệt.đã có thể sử dụng nó nếu biết trước: P –
Thực sự rất mát mẻ, tôi chỉ tìm thấy một wrapper Delphi cho quá http://irsoft.de/web/strnatcmp-and-natsort-for-delphi –
Điều này sẽ không hoạt động trong mọi trường hợp . Giả sử ypu có danh sách các mục sau: "0/30" "0/248" "0/496" "0/357.6". Thứ tự này sẽ được keept sau khi phân loại, đó không phải là những gì bạn có thể mong đợi. –