簡體   English   中英

在C#中對二維數組進行排序

[英]Sorting two dimensional array in c#

我正在嘗試對我的字符串數組進行排序,但是我不知道該怎么做:(我有一個看起來像這樣的列表: 在此處輸入圖片說明

在字段上是一個名稱,一個是值,它們都是字符串。 我需要按值對列表進行排序,並返回14個值最大的名稱。 常規排序無法幫助我解決這個問題,所以也許你們中的一個人知道我該怎么做?

using (StreamReader reader = new StreamReader(response.Stream))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        resultsList.Add(line);
    }
}

var list= new List<string[]>();
foreach (var row in resultsList)
{
    var temp = row.Split(new string[] { "\t" }, StringSplitOptions.None);
    list.Add(temp);
}

假設您有一個列表,並且值始終是數組的第二個元素,則可以像這樣對列表進行排序

list.Sort((sa1, sa2) => sa1[1].CompareTo(sa2[1]));

如果該值可以不是0-9,則應將其轉換為int。

list.Sort((sa1, sa2) => Int32.Parse(sa1[1]).CompareTo(Int32.Parse(sa2[1])));

當然,正確的做法是構建某個類的列表,而不是使用數組列表,而是依賴於數組結構。

list.OrderByDescending(x=>x[1]).Take(14)

OrderBy部分告訴它獲取初始數組,並根據每個內部數組的第二個元素對其進行排序。 然后,匯整將結果集限制為所需的14個。

這與“ Sort解決方案不同,因為它以相同的順序保留了原始列表。

看起來您有以下內容:

    string[][] arrayOfStringArrays = new string[5][];
    arrayOfStringArrays[0] = new string[] { "name1", "value1" };
    arrayOfStringArrays[1] = new string[] { "name2", "value2" };
    arrayOfStringArrays[2] = new string[] { "name3", "value3" };
    arrayOfStringArrays[3] = new string[] { "name4", "value4" };
    arrayOfStringArrays[4] = new string[] { "name5", "value5" };

然后,您可以執行以下操作:

    var sortedValues = arrayOfStringArrays.Select(e => e.LastorDefault()).OrderBy(s => s);

    //created a separate variable for "n" just for illustration purposes
    var n = 14;
    var firstNElements = sortedValues.Take(n);
list.OrderByDescending(o => o[1]).Take(14);

您可以使用OrderByDescending並將第二個數組值指定為“屬性”排序。 然后進入前14名。

您可以將列表轉換為帶有字符串鍵和int值的字典,這使選擇更加容易:

        Dictionary<string,int> dict = 
            list.Select(i => new KeyValuePair<string, int>(i[0], Convert.ToInt32(i[1]))).ToDictionary(kv=>kv.Key, kv=>kv.Value);
        var items = dict.OrderByDescending(d => d.Value).Select(d => d.Key).Take(14);

否則,您可以直接從列表中選擇,但是由於我假設您使用的是string[][] ,因此無法使用OrderBy。 因此,需要一個自定義比較器:

    public class ListComparer : IComparer<string>
    {
        public int Compare(string x, string y)
        {
            if (x == null)
            {
                if (y == null)
                {
                    // If x is null and y is null, they're
                    // equal. 
                    return 0;
                }
                else
                {
                    // If x is null and y is not null, y
                    // is greater. 
                    return -1;
                }
            }
            else
            {
                // If x is not null...
                //
                if (y == null)
                // ...and y is null, x is greater.
                {
                    return 1;
                }
                else
                {
                    // ...and y is not null, compare the 
                    // int values of the two strings.
                    //
                    return Convert.ToInt32(x).CompareTo(Convert.ToInt32(y));
                }
            }
        }
    }

然后您就可以使用

var sortedList = list.OrderByDescending(d => d[1], new ListComparer()).Take(14);

暫無
暫無

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

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