【问题标题】:How do I sort IList C # by date?如何按日期对 IList C# 进行排序?
【发布时间】:2017-06-07 11:18:38
【问题描述】:

我有一个 IList:

IList[] info = new IList[2];
info[0] = Date;      //List<DateTime> item
info[1] = something; //List<double> item

所以,我想按info[0] 中的日期对info 进行排序。像这样:

 Date.Sort((a, b) => a.CompareTo(b));

但是当我尝试这样做时:

IEnumerable[] sortedEnum = info.OrderBy(info[0].Sort((a, b) => a.CompareTo(b)));

我明白了:

“System.Collections.IList”不包含“Sort”的定义,并且找不到接受“System.Collections.IList”类型的第一个参数的扩展方法“Sort”(您是否缺少 using 指令或程序集参考?)。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你为什么使用obsolete IListIEnumerable?将它们更改为 IList&lt;Object&gt;IEnumeratble&lt;Object&gt;
  • 所以...您有一个列表数组 - 您是否要对数组进行排序?还是您实际上是在尝试对这两个列表进行排序,使两者保持同步?
  • 这甚至没有意义。您将如何按该列表中的一项对项目列表进行排序?此外,LINQ 不适用于非泛型 ILists。如果你有IList&lt;T&gt;,那么它只是info.OrderBy(x =&gt; x.DateProperty)

标签: c# winforms list linq sorting


【解决方案1】:

我认为这是一个 X/Y 问题。您正在尝试解决一个复杂的“对彼此一致的两个列表进行排序”。而且...您可以这样做,但这非常困难。 Array.Sort 有一个合适的方法来对连接的两个 arrays 进行排序,但是:不是列表。您可以尝试这样做,但坦率地说,我认为您正在解决错误的问题。如果每个DateTimedouble 都是逻辑连接的,那么而不是 有两个列表:一个 列表具有复合值。例如:

var list = new List<(DateTime when, double value)>();
list.Add((dateX, valueX)); // your values...
list.Add((dateY, valueY));
list.Add((dateZ, valueZ));

list.Sort((x,y) => x.when.compareTo(y.when));

这里我使用元组类型,但同样的事情可以通过声明你自己的类型来保存复合值来完成。您可能还想查看预先排序的列表容器类型,但这对键值(唯一性等)提出了更高的要求。

【讨论】:

  • 澄清一下,ValueTuple 是 C# 7 中的一个新特性,适用于 .Net 4.7。您可以使用的其他类是 Tuple 类、KeyValuePair、Dictionary 或创建您自己的类
  • @Magnetron ValueTuple 为.NET 4.5 或以上,.NETStandard 1.0 或以上; nuget.org/packages/System.ValueTuple
  • 只有当你下载包时,这就是我说“本地”的原因。在 .Net 4.7 中包含它,您不需要安装任何附加的 dll。
  • 谢谢!这正是我一直在寻找的
【解决方案2】:

建立在马克的基础上

List<(DateTime when, double value) list = info[0].Zip(info[1], (d,v)=> (d,v));

正如磁控管指出的那样,如果你还没有 C#7,

var list = info[0].Zip(info[1], (d,v)=> Tuple.Create(d,v));
list.Sort((x,y) => x.Item1.compareTo(y.Item1));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2018-03-30
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    相关资源
    最近更新 更多