如何按 C# 中的特定字段对对象列表进行排序?

     2023-03-27     231

关键词:

【中文标题】如何按 C# 中的特定字段对对象列表进行排序?【英文标题】:How to sort a list of objects by a specific field in C#? 【发布时间】:2009-08-19 18:34:40 【问题描述】:

我有这门课:

public class StatInfo

  public string contact;
  public DateTime date;
  public string action;

然后我有一个 StatInfo 列表,但我不确定如何根据日期字段对其进行排序。我应该使用排序方法吗?我应该创建自己的吗?

var _allStatInfo = new List<StatInfo>();
// adding lots of stuff in it
_allStatInfo.SortByDate???

无需编写大量代码(如果可能的话),最好的方法是什么?

谢谢

【问题讨论】:

等待 Jon Skeet 出现。他的 C# in Depth: What you need to master C# 2 and 3 在这方面有很大的篇幅。 太晚了!当我关于 C# 的一个问题没有得到 Jon Skeet 的回答时,我总是感到惊讶:) 标题错误。说“数组” 【参考方案1】:

使用 LINQ:

var sortedList = _allStatInfo.OrderBy(si => si.date).ToList();

对原始列表进行排序:

_allStatInfo.Sort(new Comparison<StatInfo>((x, y) => DateTime.Compare(x.date, y.date)));

【讨论】:

谢谢,第二种方法奏效了。我不使用 LINQ,所以无法测试第二个。【参考方案2】:

我知道你已经得到了答案,但是......

    你可以通过将语句分成两半来避免一些丑陋:

    Comparison<StatInfo> comparison = (x, y) => DateTime.Compare(x.date, y.date);
    _allStatInfo.Sort(comparison);
    

    您也可以考虑直接致电CompareTo

    Comparison<StatInfo> comparison = (x, y) => x.date.CompareTo(y.date);
    _allStatInfo.Sort(comparison);
    

    您可以使用我的 ProjectionComparer 类创建一个 IComparer&lt;T&gt; 实现 - 它是MiscUtil 的一部分,我在底部添加了一个未注释的版本 这个答案。然后你会写:

    _allStatInfo.Sort(ProjectionComparer<StatInfo>.Create(x => x.date));
    

    即使您使用的是 .NET 2.0,您仍然可以通过 LINQBridge 使用 LINQ。

这是第二个答案所需的 ProjectionComparer 类。前几个类实际上只是帮助泛型类型推断更好地工作。

public static class ProjectionComparer

    public static ProjectionComparer<TSource, TKey> Create<TSource, TKey>
        (Func<TSource, TKey> projection)
    
        return new ProjectionComparer<TSource, TKey>(projection);
    

    public static ProjectionComparer<TSource, TKey> Create<TSource, TKey>
        (TSource ignored, Func<TSource, TKey> projection)
    
        return new ProjectionComparer<TSource, TKey>(projection);
    



public static class ProjectionComparer<TSource>

    public static ProjectionComparer<TSource, TKey> Create<TKey>
        (Func<TSource, TKey> projection)
    
        return new ProjectionComparer<TSource, TKey>(projection);
    


public class ProjectionComparer<TSource, TKey> : IComparer<TSource>

    readonly Func<TSource, TKey> projection;
    readonly IComparer<TKey> comparer;

    public ProjectionComparer(Func<TSource, TKey> projection)
        : this (projection, null)
    
    

    public ProjectionComparer(Func<TSource, TKey> projection,
                              IComparer<TKey> comparer)
    
        projection.ThrowIfNull("projection");
        this.comparer = comparer ?? Comparer<TKey>.Default;
        this.projection = projection;
    

    public int Compare(TSource x, TSource y)
    
        // Don't want to project from nullity
        if (x==null && y==null)
        
            return 0;
        
        if (x==null)
        
            return -1;
        
        if (y==null)
        
            return 1;
        
        return comparer.Compare(projection(x), projection(y));
    

【讨论】:

哦,谢谢,就在我说我没有得到你关于 C# 问题的答案时 :) 我会接受 Ben 的答案,但我赞成你的答案,我相信它会在正下方 @Ben:如果我能帮上忙,我就是不喜欢那么多括号:) Jon,在您的Compare 方法中,真的需要空检查吗?这应该留给调用者。 @nawfal:我不这么认为。您希望能够通过foo =&gt; foo.Name 订购,而无需通过foo =&gt; foo == null ? null : foo.Name IMO。 @JonSkeet 您提供的示例可以写得更好,但仅此而已。如果我们提供像Compute(int, string) 这样的方法作为投影,比如_allStatInfo.Sort(ProjectionComparer&lt;StatInfo&gt;.Create(x =&gt; Compute(someInt, x))),其中x 的空值是完全可以接受的怎么办?如果必须完全通用,则应由投影自行决定是否抛出空引用异常或忽略空值。【参考方案3】:

为了说明 Robert C. Cartaino 的回答:

public class StatInfo : IComparable<StatInfo>

    public string contact;
    public DateTime date;
    public string action;

    public int CompareTo(StatInfo value)
    
        return this.date.CompareTo(value.date);
    


var _allStatInfo = new List<StatInfo>();

// this now sorts by date
_allStatInfo.Sort();

这不是最通用的解决方案,但如果您只想按日期排序,则很好。而且,正如 Robert 所说,您始终可以通过将 IComparer 参数传递给 sort 方法来覆盖默认排序。

【讨论】:

谢谢。它并不真正适用于我的情况,因为我只会在这种特殊情况下按日期排序,但我会记住这一点以备后用 @marcgg:我的答案中的代码使按日期排序成为默认行为。因此,如果您只按日期排序,我认为这正是您想要的。【参考方案4】:

使用 lambda 表达式将一对映射到一个比较:

_allStatInfo.Sort((x, y) => x.date - y.date);

【讨论】:

感谢您的回答,但我收到一个错误:无法将 lambda 表达式转换为类型 System.Collections.Generic.IComparer' 因为它不是委托类型跨度> 【参考方案5】:

它对我有用ُSorting array of custom type using delegate

// sort array by name
Array.Sort(users, delegate(User user1, User user2) 
           
             return user1.Name.CompareTo(user2.Name);
           );
// write array (output: Betty23 Lisa25 Susan20)
foreach (User user in users) Console.Write(user.Name + user.Age + " ");

【讨论】:

【参考方案6】:

对于 DateTime,不需要比较。

_allStatInfo.OrderyBy(d => d.date);

_allStatInfo.OrderByDescending(d => d.Date);

【讨论】:

两种方法都返回列表,所以你需要 _allStatInfo = _allStatInfo.OrderBy(d => d.date).ToList(); 谢谢,如果我没记错的话,List 没有这样的功能 我猜这是 LINQ。我没有使用 LINQ

如何按 .NET 2.0 中的特定属性对列表进行排序? [复制]

】如何按.NET2.0中的特定属性对列表进行排序?[复制]【英文标题】:Howtosortalistbyaspecificpropertyin.NET2.0?[duplicate]【发布时间】:2013-04-0111:37:06【问题描述】:在.NET4.0中,您可以简单地使用LINQ按特定属性快速排序列表:List<Point>... 查看详情

以特定顺序对(数组)列表进行排序

】以特定顺序对(数组)列表进行排序【英文标题】:Sortan(Array)Listwithaspecificorder【发布时间】:2014-01-0105:55:05【问题描述】:我有一个对象列表,我想按照定义的顺序对其进行排序。例如。我有一个带有Stringcolor字段的对象。... 查看详情

如何按距离(以英里为单位)从 C# 中的给定纬度/经度对纬度/经度列表进行排序?

】如何按距离(以英里为单位)从C#中的给定纬度/经度对纬度/经度列表进行排序?【英文标题】:Howtosortalistoflat/longbydistance(inmiles)fromagivenlat/longinC#?【发布时间】:2019-12-1406:01:21【问题描述】:我需要根据与用户当前纬度/经度... 查看详情

Vue.js - 如何按特定属性对数组中的对象进行排序并使用“v-for”进行渲染

】Vue.js-如何按特定属性对数组中的对象进行排序并使用“v-for”进行渲染【英文标题】:Vue.js-howtosortandobjectsinsidethearraybyparticularpropertyandrenderitwith"v-for"【发布时间】:2019-08-1708:42:24【问题描述】:我有一个数组,里面有... 查看详情

Android-java-如何按对象内的某个值对对象列表进行排序

】Android-java-如何按对象内的某个值对对象列表进行排序【英文标题】:Android-java-Howtosortalistofobjectsbyacertainvaluewithintheobject【发布时间】:2012-02-2423:07:27【问题描述】:我试图通过对象中的特定值对对象数组列表进行排序。做这... 查看详情

使用比较器按特定顺序对对象列表进行排序

】使用比较器按特定顺序对对象列表进行排序【英文标题】:Sortingalistofobjectsinaspecificsequenceusingcomparator【发布时间】:2021-11-0623:50:21【问题描述】:我遇到了一个让我感到困惑的问题。我有一堂课:classOrderprivatelongcustomerId;privat... 查看详情

如何按日期(createdAt)对aws-amplify中列表查询中的字段进行排序?

】如何按日期(createdAt)对aws-amplify中列表查询中的字段进行排序?【英文标题】:Howtosortbydate(createdAt)onafieldinlistqueryinaws-amplify?【发布时间】:2020-01-3120:35:46【问题描述】:typeTest@model@key(fields:["id","createdAt"])id:ID!name:StringcreatedAt... 查看详情

如何对 python 3 中的列表进行排序,优先考虑特定值?

】如何对python3中的列表进行排序,优先考虑特定值?【英文标题】:HowcanIsortalistinpython3withprioritygiventospecificvalues?【发布时间】:2020-05-0523:14:28【问题描述】:我有一个名为V的列表。V的元素将是以下之一:0,1,2或+inf我想对此列... 查看详情

如何按另一个列表对列表进行排序

】如何按另一个列表对列表进行排序【英文标题】:Howtosortalistbyanotherlist【发布时间】:2021-01-2321:19:37【问题描述】:如何对包含对象的列表进行排序,以便对象的属性与dart中的不同列表匹配?classExampleString_id;Stringgetid=>_id;Li... 查看详情

按两个字段对 Python 列表进行排序

...r(1))我实际上想按两个标准对列表进行排序:首先按字段1中的值,然后按字段2中的值。我该怎么做?【问题讨论】:Sortalistbymultipleatt 查看详情

在 C# 中对对象列表进行排序

】在C#中对对象列表进行排序【英文标题】:SortingaListofobjectsinC#【发布时间】:2010-10-2920:31:50【问题描述】:publicclassCarSpecspublicStringCarNameget;set;publicStringCarMakerget;set;publicDateTimeCreationDateget;set;这是一个列表,我正在尝试找出一种... 查看详情

Java按整数字段对对象数组进行排序,如果它们相同,则按另一个整数值排序

...ava问题,涉及对对象数组列表进行排序。我已经想出了按特定字段对对象的arrayList进行排序,可以 查看详情

按特定参数对对象列表进行排序(代码片段)

我有和具有多个参数的对象的ArrayList。我需要创建一个方法,通过某个参数对列表进行排序。我的班级是:publicclassVehicleLoadedprivateintvlrefid;privateintvehicleRefId;privateintload_time;...publicELPEVehicleLoaded()我需要按加载时间(按升序)对包... 查看详情

如何按对象中的值对数组进行排序

】如何按对象中的值对数组进行排序【英文标题】:Howtosortanarraybyvaluefromanobject【发布时间】:2020-11-1510:52:05【问题描述】:如何按点赞数对数组进行排序?我试过这样,但它不起作用。如果需要,我也可以使用列表而不是数组... 查看详情

java示例代码_对列表进行排序<;对象>;按字母顺序使用对象名称字段

java示例代码_对列表进行排序<;对象>;按字母顺序使用对象名称字段 查看详情

如何在VB中按某个组件对对象列表进行排序?

】如何在VB中按某个组件对对象列表进行排序?【英文标题】:HowcanIsortalistofobjectsbyacertaincomponentinVB?【发布时间】:2021-10-1611:23:57【问题描述】:我正在使用带有.NET3.5的VisualStudio2008,我正在尝试对存储某个对象的子对象的对象... 查看详情

如何按多个字段对对象数组进行排序?

】如何按多个字段对对象数组进行排序?【英文标题】:Howtosortanarrayofobjectsbymultiplefields?【发布时间】:2011-10-1807:35:19【问题描述】:从这个originalquestion,我将如何对多个字段应用排序?使用这个稍微调整的结构,我将如何排... 查看详情

如何按每个对象的成员对对象列表进行排序? [复制]

】如何按每个对象的成员对对象列表进行排序?[复制]【英文标题】:HowcanIsortalistofobjectsbyamemberofeachobject?[duplicate]【发布时间】:2013-09-2313:32:50【问题描述】:classcandlepublicDateTimedateget;set;publicdoubleopenget;set;publicdoublehighget;set;publi... 查看详情