【问题标题】:Sorting a collection by multiple fields按多个字段对集合进行排序
【发布时间】:2013-09-10 05:42:04
【问题描述】:

我需要对集​​合进行排序。 例如,我有

Austin 12/3/2012   
Sam 100 12/3/2012   
Sam 200 14/3/2012   
Bubly 300 12/3/2012   
Bubly 300 15/3/2012  
ram 100 13/3/2012 

现在如果排序顺序是名称,日期时间 那么输出应该是

Austin 12/3/2012    
Bubly 12/3/2012   
Bubly 15/3/2012   
ram 13/3/2012    
sam 12/3/2012    
sam 14/3/2012  

如果他的排序顺序是 Datetime , Name then 应该是

12/3/2012 austin
12/3/2012 bubly
12/3/2012 sam
13/3/2012 ram
14/3/2012 sam
15/3/2012 bubly 

相应地用于其他项目。我该怎么做呢 ?如何按列的顺序进行排序。

【问题讨论】:

  • 看起来您想动态订购它(取决于某些参数)?
  • OrderBy(...).ThenBy(...) ?
  • 你这里不是很清楚,你是怎么表明你要订购什么的?您是否尝试传入委托函数来管理排序?

标签: c# .net linq sorting


【解决方案1】:

在使用OrderBy之后可以使用Linq函数ThenBy进行进一步的排序。

listOfRecords.OrderBy(p => p.Name).ThenBy(p => p.Date)

【讨论】:

  • 这里的问题是没有定义列的顺序??有时它可以是名称然后是日期,有时它可以是日期然后是名称..那么我该如何编写通用语句。
  • 如何确定列的顺序?其背后的逻辑是什么?
  • @user1687824,您可以使用“SortDimensions”列表来实现此目的。请参阅下面的答案,但您可能需要为 SortDimensions 对象使用 List<object> 以外的其他类型。
  • 如果这是一个问题,那么只需编写包装函数,您可以在其中将排序顺序作为参数传递。
【解决方案2】:

类似这样的:

yourList.OrderBy(o => o.DateTime).ThenBy(o => o.Number);

【讨论】:

    【解决方案3】:

    我会创建一个类来保存你的信息

    public class NameDate
    {
        private string name;
        private DateTime date;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public DateTime Date
        {
            get { return date; }
            set { date = value; }
        }
    }
    

    然后我会填充 List<NameDate> 来保存您的物品。完成后,您可以使用 LINQ 对项目进行排序

    List<NameDate> someList = new List<NameDate>();
    someList = GetNameDateList();
    var orderedByNameList = someList.OrderBy(e => e.Name);
    var orderedByDateTimeList = someList.OrderBy(e => e.Date);
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      首先创建两个函数:

      var SortByDate=(p=>p.Date);
      var SortByName=(p=>p.Name);
      

      然后,例如,您有一个包含两个的列表

      var SortDimensions=new List<object>({SortByDate,SortByName});
      

      如果你想按第一个日期排序,那么你的名字:

      myList.OrderBy(SortDimensions[0]).ThenBy(SortDimensions[1]);
      

      现在,这里是棘手的部分,如果您想先按名称排序然后日期,您只需更改 SortDimensionsList 中函数的顺序:

      SortDimensions.Remove(SortByName);
      SortDimensions.Insert(0,SortByName);
      

      这样,同样的 OrderBy 语句会给你不同的结果。

      PS。诚然,这非常接近于伪代码,因为您可能必须对 SortDimensions 集合使用 List&lt;object&gt; 以外的其他内容以避免编译器错误,但我目前无法访问 IDE,但答案的精神保持原样。创建一个集合,在其中存储委托函数,然后更改集合中的顺序以使用相同的通用代码实现不同的排序维度。

      【讨论】:

      • Reverse SortDimensions 中的元素顺序而不是Remove 和re-Insert 不是更好吗?这种方法很好。
      • 好吧,可能有三个或四个排序维度,OP 可能希望先按 ABCD 排序,然后按 BACD。我认为这种方法更灵活。
      • 如果我采用这种方法,集合是否会循环多次,因为我需要排序的库/字段?
      • 是的,但是使用其他方法也会循环相同的次数。 LINQ 子句与其他答案相同。
      • 如何/在哪里定义函数 var SortByDate=(p=>p.Date); ??
      猜你喜欢
      • 2015-10-01
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-28
      • 2016-04-01
      相关资源
      最近更新 更多