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进行排序?感谢。
答案 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();