I have a List that I need to sort by DateTime, the c开发者_运维知识库lass MyStuff looks like:
public class MyStuff
{
public int Type {get;set;}
public int Key {get;set;}
public DateTime Created {get;set;}
}
I need to be able to sort the collection List by the Created (DateTime) field.
You seem to be working with a List<T>
object, in which case the most efficient (and a simple) method would be the following:
myList.Sort((x, y) => DateTime.Compare(x.Created, y.Created));
This uses the overload of the List.Sort method than takes a Comparison<T>
delegate (and thus lambda expression).
You can of course use the LINQ OrderBy
extension method, but I don't think this offers any advantages, and can be significantly slower, depending on your situation.
myList = myList.OrderBy(x => x.Created).ToList();
var query =
from m in mystuffcollection
orderby m.Created ascending
select m;
For those who are looking for a way to sort the data on the basis of a nested property can use the sort function something like below:
MyList.Sort((x, y) => x.Datetime.CompareTo(y.Datetime));
Now the major differences between using OrderBy and Sort are performance and return value.
Sort basically sorts the existing List<T>
whereas OrderBy returns a new IEnumerable<T>
You can use using System.Linq;
from entity framework, considering you are using .net core in your application. The Linq provides you both FilterBy and OrderBy methods, for custom FilterBy and OrderBy you need to override the methods in your class or Repository.
override
protected IQueryable<T> FilterBy(IQueryable<T> myProcess, string filterBy, string filterValue)
{
var listFilter = filterBy.Split(',');
var listValues = filterValue.Split(',');
for (int index = 0; index < listFilter.Length; index++)
{
var filter = listFilter[index];
var value = listValues[index];
switch (filter)
{
case "type":
myProcess = myProcess.Where(c => c.Status.Nome.Contains(value));
break;
case "created":
myProcess = myProcess.Where(c => c.Created - DateTime.Parse(value) >= new TimeSpan(0, 0, 0));
default:
break;
}
}
}
override
protected IQueryable<T> OrderBy(IQueryable<T> myProcess, string attribute, string direction)
{
switch (attribute)
{
case "type":
myProcess = (direction == "asc")
? myProcess.OrderBy(c => c.Type)
: myProcess.OrderByDescending(c => c.Type);
return myProcess;
case "created":
myProcess = (direction == "asc")
? myProcess.OrderBy(c => c.Created)
: myProcess.OrderByDescending(c => c.Created);
return myProcess;
}
}
精彩评论