簡體   English   中英

C#用數字排序一個arraylist

[英]C# sorting a arraylist with figures

您好我想要一個排序數組,其中包含:

String[] info = new String[5]{"6,j", "7,d", "12,s", "4,h", "14,s" };

但如果我使用這個:

Array.Sort(info);

輸出變為:

"7,d"
"6,j"
"4,h"
"14,s"
"12,s"

但我不會輸出:

"14,s"
"12,s"
"7,d"
"6,j"
"4,h"

使用C#最簡單的方法是什么?

當我這樣做時,我不能讓字母數字排序工作:

Array.Sort(info, new AlphanumComparatorFast());

如果找不到using指令或程序集引用,則無法找到類型或命名空間“AlphanumComparatorFast”

是我得到的錯誤......

嘗試:

var sortedArray = info.OrderBy(s=>int.Parse(s.Split(',')[0])).ToArray();

這只是通過數字部分排序,但您可以詳細說明該示例。 這段代碼強烈假設總是有逗號分隔符,這可能是生產中的一個問題,做一些更准確的錯誤處理。 如果數組包含一些不符合異常的元素,假設忽略失敗的元素是可以接受的,我們可以寫:

 var sortedArray = info.Where(k=>!string.IsNullOrEmpty(k)&&k.IndexOf(",")!=-1)
.OrderBy(s=>int.Parse(s.Split(',')[0])).ToArray();

您可以解析它們並將它們分成一個類,而不是將它們表示為字符串。 實現IComparable並且您已經排序。 雙關語完全打算。

或者,實現自己的排序比較器來解析對象,然后對它們進行正確排序。

你可以使用自定義比較器

public class MyComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        // return value greater than zero if x is greater than y
        // return zero if x is equal to y
        // return value less than zero if x is less than y
    }
}

你可以像這樣使用你的比較器

Array.Sort(info, new MyComparer());

如果您使用的是.NET 2.0並且無法使用Linq,您可以嘗試:

 String[] info = new String[5] { "6,j", "7,d", "12,s", "4,h", "14,s" };
            Array.Sort(info, delegate(string a, string b)
            {
                int numberA = int.Parse(a.Substring(0, a.IndexOf(',')));
                int numberB = int.Parse(b.Substring(0, b.IndexOf(',')));

                string stringA = a.Substring(a.IndexOf(','));
                string stringB = b.Substring(b.IndexOf(','));

                if (numberA > numberB) return -1;
                else if (numberA < numberB) return 1;
                else return stringA.CompareTo(stringB);
            }
                );

這假設分隔符始終是逗號,如果需要,請添加您自己的驗證代碼。

對字符串的數字部分進行排序:

var info = new String[5]{"6,j", "7,d", "12,s", "4,h", "14,s" };
foreach (var item in info.OrderByDescending (x => 
                                   int.Parse(x.Substring(0, x.IndexOf(',')))))
{
    Console.WriteLine(item);
}

這是我前一段時間寫的一些代碼,我確信有一種更有效的方法可以做到,但這肯定有效。 要使用它,包括:

using System.Linq;

然后調用使用linq查詢:

Array.Sort(info,delegate(string x, string y){return NaturalCompare(y,x)}); sort as you seem to want

當然還包括相關方法:

    public int NaturalCompare(string x, string y)
    {
        string[] x1, y1;
        x1 = Regex.Split(x.Replace(" ", ""), "([0-9]+)");
        y1 = Regex.Split(y.Replace(" ", ""), "([0-9]+)");
        for (int i = 0; i < x1.Length && i < y1.Length; i++)
        {
            if (!x1[i].Equals(y1[i]))
            {
                return PartCompare(x1[i], y1[i]);
            }
        }
        return x.CompareTo(y);
    }

    private int PartCompare(string left, string right)
    {
        int x, y;
        if (int.TryParse(left, out x) && int.TryParse(right, out y))
            return x.CompareTo(y);
        return left.CompareTo(right);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM