Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表上的自定义订购人<;T>;_C#_Asp.net_Asp.net Mvc_Linq - Fatal编程技术网

C# 列表上的自定义订购人<;T>;

C# 列表上的自定义订购人<;T>;,c#,asp.net,asp.net-mvc,linq,C#,Asp.net,Asp.net Mvc,Linq,我正试图找出对列表进行自定义排序的最佳方法。假设T是一个具有日期(DateTime?)属性和状态(string)属性的对象 我有三个案子 “紧急”:我希望这些在列表的顶部,没有特别的顺序 日期=空 status=“紧急” “正常”:我想在紧急情况之后按日期订购这些 日期=任何有效的日期/时间 status=“准时” “稍后”:我希望这些在列表的底部,没有特定的顺序 日期=空 status=“稍后” 有什么想法吗?我应该使用可读取对象而不是列表吗?我始终可以.ToList()稍后将对象发送到我的视

我正试图找出对列表进行自定义排序的最佳方法。假设T是一个具有日期(DateTime?)属性和状态(string)属性的对象

我有三个案子

“紧急”:我希望这些在列表的顶部,没有特别的顺序
日期=空
status=“紧急”

“正常”:我想在紧急情况之后按日期订购这些
日期=任何有效的日期/时间
status=“准时”

“稍后”:我希望这些在列表的底部,没有特定的顺序
日期=空
status=“稍后”

有什么想法吗?我应该使用可读取对象而不是列表吗?我始终可以.ToList()稍后将对象发送到我的视图

query = query.OrderBy(x =>
  x.Status == "Urgent" ? 1:
  x.Status == "Normal" ? 2:
  3)
  .ThenBy(x => 
  x.Status == "Urgent" ? null:
  x.Status == "Normal" ? x.Date:
  null);

随机思考:排序是属于查询还是属于类?

应该不会太难,只要使用比较规则使
t
实现,就可以设置了。

您可以使用扩展方法:

像这样的

public static IOrderedEmumerable<MyType> OrderForDisplay (this IEnumerable<MyType> input)
{
  return
    input
    .OrderBy(item => item.Status)
    .ThenByDescending(item => item.Status == 1 ? DateTime.MaxDate : item.date);
}
publicstaticiorderedemumerable OrderForDisplay(此IEnumerable输入)
{
返回
输入
.OrderBy(项=>item.Status)
.ThenByDescending(item=>item.Status==1?DateTime.MaxDate:item.date);
}

您需要提供IComparer的实现,然后您可以使用以下重载将其传入:

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IComparer<TKey> comparer
)
公共静态IORDerenumerable OrderBy(
这是一个数不清的来源,
Func键选择器,
IComparer比较器
)

请参阅:

我认为最简单的方法是使用linq:

itemsList = itemsList.OrderByDescending(ob => ob.status ).ThenBy(ob => ob.date).ToList();

根据我的理解,对象的工作是通过实现IComparablet来处理排序这是表达式的另一种方式为什么要为类似的东西实现自己的扩展方法?还有更好的方法,请参阅其他答案。因为它可以在代码中的其他地方重用(如果需要的话),并使其顺序一致。var MyItemsToDisplay=MyList.OrderForDisplay();(等…)状态为字符串,因此orderby将产生与请求不同的顺序。只有普通项目应该按日期排序,并且您的代码不会编译,因为没有方法名实现
IComparable
可以实现相同的目标。但是用一种标准的方法,我还是在胡闹。这会将.OrderBy()从图片中删除,对吗?。如果我走这条路线,我现在会调用list.Sort()。这对未来的读者来说是很清楚的。@BZink那么你也应该能够做到
。。。myCollection.OrderBy(o=>o)
将使用对象的默认比较器对对象进行排序,该对象应该是
IComparable
的实现,但是我不认为使用此方法比
Sort()
方法有任何优势。