繁体   English   中英

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

[英]How do I sort 2 lists by the same criteria?

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进行排序? 谢谢。

假设您有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();

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

编辑

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

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

要么

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

在SynXsiS的代码中,您为每个日期/ int对分配一个新的匿名对象,以及另一个用于保存它们的数组(由OrderBy调用返回的OrderedEnumerable专用),以及另一个用于保存它们的数组(ToArray调用,这也许可以省略),然后你两次迭代该数组创建两个阵列。

如果这些性能考虑并不重要(并且很可能不是这些),我仍然会根据更短的代码选择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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM