如何按相同标准对2个列表进行排序?

时间:2012-02-06 02:52:43

标签: c# arrays list

public void sort() 
{
    datelist = new List<DateTime>(rdate);   //timedates
    intlist = new List <Int>(rint);         //integers

    datelist.Sort((a, b) => a.CompareTo(b)); //sorts the dates ascending(I think)
}

我有两个初始数组;这些按索引号匹配。我已将这些转换为列表以便对它们进行排序。我如何以与datelist完全相同的方式对intlist进行排序?感谢。

2 个答案:

答案 0 :(得分:2)

假设您拥有linq(.net 3.5 +),您可以执行以下操作。

// Define your collections
var dates = new[]
                {
                    new DateTime(2012, 1, 1), new DateTime(2012, 1, 2), new DateTime(2012, 1, 5),
                    new DateTime(2012, 1, 3)
                };
var ints = new[] {1,2,4,3};

var result = dates
    .Select((d, i) => new {Date = d, Int = ints[i]}) // This joins the arrays based on index
    .OrderBy(o => o.Date) // Sort by whatever field you want
    .ToArray(); // Return the results an array

// Extract just the dates
dates = result.Select(o => o.Date).ToArray();
// Extract just the ints
ints = result.Select(o => o.Int).ToArray();

答案 1 :(得分:0)

不要创建列表;使用一个带有两个数组参数的静态Array.Sort重载。该方法使用默认比较器或您提供的比较器,按照“keys”数组中的值指定的顺序对两个数组进行排序。

修改

由于最近的upvote(谢谢,upvoter!)重新审视这个答案,我想强调一下,Array.Sort解决方案使用的代码少得多,内存开销/垃圾收集压力也小得多:

public void sort()  
{
    Array.Sort(rint, rdate); //sorts both arrays in the order dictated by the ints
}

OR

public void sort()  
{
    Array.Sort(rdate, rint); //sorts both arrays in the order dictated by the dates
}

在SynXsiS的代码中,你为每个日期/ int对分配一个新的匿名对象,以及另一个保存它们的数组(由OrderBy调用返回的OrderedEnumerable专用),再加上另一个数组来保存它们(ToArray调用,可能会被省略),然后你将该数组迭代两次以创建两个 more 数组。

如果这些性能考虑因素并不重要(并且很可能不是这些考虑因素),我仍会根据较短的代码选择Array.Sort解决方案。

最后,SynXsiS的解决方案将受益于Enumerable.Zip:

result = dates.Zip(ints, (d, i) => new { Date = d, Int = i }).OrderBy(o => o.Date);
dates = result.Select(o => o.Date).ToArray();
ints = result.Select(o => o.Int).ToArray();