【问题标题】:How to Sort a List by a property in the object如何按对象中的属性对列表进行排序
【发布时间】:2014-01-21 05:21:34
【问题描述】:

我有一个名为 Factor 的类,它的属性为 Id、Explain、Date、Amount 和 ...。我有一个这个“Factor”类的列表。

现在我想根据 Factor 对象的一个​​属性(按日期)对列表进行排序

public class Factor
    {
        public DateTime? date { set; get; }
        public string InnovoiceId { set; get; }
        public string explain { set; get; }
        public Int64? bedehkar { set; get; }
        public Int64? bestankar { set; get; }
        public Int64? mande { set; get; }



     }

        List<Factor> factors=new List<Factor>();

如何在 C# 中做到这一点?

【问题讨论】:

标签: c#


【解决方案1】:

您可以使用 LINQ 获取已排序项目的新列表:

var sortedFactors = factors.OrderBy(x => x.explain).ToList();

或者您可以使用List&lt;T&gt;.Sort 方法对其进行就地排序:

factors.Sort((e1, e2) => e1.explain.CompareTo(e2.explain));

更新

List&lt;T&gt;.Sortdate 属性一起使用有点棘手,因为它的Nullable&lt;DateTime&gt;,并且如何排序null 和非null 值并不是很明显。

factors.Sort((e1, e2) => e1.date.HasValue ? (e2.date.HasValue ? e1.date.Value.CompareTo(e2.date.Value) : -1) : ((e2.date.HasValue ? 1 : 0)));

【讨论】:

  • 严格来说,他或她一开始的“名单”已经不是那样了。
  • 他想通过date 订购,无论如何+1 ;)
  • @MarcinJuraszek:是的,现在。 OP 在他的问题中说他或她想要对 那个 列表进行排序,所以 OrderBy 并不是第一个关联。
  • @O.R.Mapper 在某些情况下,您需要排序版本的列表而不修改源集合。
  • @MarcinJuraszek:这里不是这样,因为问题是“现在我想对列表进行排序”。
【解决方案2】:

您可以使用Sort method 的重载之一。一个简单的使用方法是使用 lambda 表达式作为排序标准 - 本质上是一个接受两个元素并返回比较结果的函数:

factors.Sort((x, y) => x.date.CompareTo(y.date));

由于您使用DateTime?,您还需要检查当前是否有值存储在其中。

【讨论】:

  • 是的,我正在使用 DateTime?
猜你喜欢
  • 1970-01-01
  • 2011-02-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
相关资源
最近更新 更多