在c#中排序二维数组

时间:2015-12-31 12:32:31

标签: c# list sorting

我正在尝试排序我的字符串数组,但我不知道该怎么做:( 我有一个如下所示的列表:enter image description here

On fields是一个名称,一个是值,所有这些都是字符串。 我需要按值对此列表进行排序,并返回具有最大值的14个名称。 定期排序无法帮助我,所以也许你们其中一个人知道我该怎么做?

{{1}}

5 个答案:

答案 0 :(得分:2)

假设您有一个List并且您的值始终是数组的第二个元素,那么您可以像这样对列表进行排序

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])));

当然,正确的做法是构建一个类的列表,而不是使用数组列表,并依赖于数组结构。

答案 1 :(得分:1)

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

OrderBy部分告诉它采取初始数组并根据每个内部数组的第二个元素对其进行排序。 Take然后将结果集限制为您想要的14。

这与Sort解决方案不同,因为它以相同的顺序保留原始列表。

答案 2 :(得分:1)

看起来你有类似的东西:

    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);

答案 3 :(得分:0)

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

您可以使用OrderByDescending并将第二个数组值指定为sort" property"。然后进入前14名。

答案 4 :(得分:0)

您可以将列表转换为包含字符串键和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);