我之前看到的问题与我的查询有关,但无法弄清楚如何解决我的问题。
我有一个列表"网站"其中一项为"年"。它被定义为字符串,格式为" MM / yyyy"。当我尝试根据年份对列表进行排序时,我面临一个小问题。
"年"的数据是
01/2012
04/2012
01/2013
06/2012
当我使用orderby对列表进行排序时,我得到的输出是
01/2012
01/2013
04/2012
06/2012
这是不正确的。
无法使用Convert.ToDateTime
转换字符串,因为字符串格式不包含日期值。我该怎么做呢?如何在不改变字符串格式的情况下实现DateTime.TryParseExact
?
注意:格式应该相同,列表应该排序。
答案 0 :(得分:8)
你可以尝试这样的事情,而不必更改输入,如果你需要以不同的排序顺序查看OrderByDescending
属性,这将给你订单
var dateList = new List<string> { "01/2012", "04/2012", "01/2013", "06/2012" };
var orderedList = dateList.OrderBy(x => DateTime.Parse(x)).ToList();
答案 1 :(得分:4)
您仍然可以将字符串转换为LINQ语句中的日期,并且这些项目将保留为字符串。
var strings = new[]
{
"01/2012",
"04/2012",
"01/2013",
"06/2012"
};
var ordered = strings.OrderBy(s =>
{
var split = s.Split('/');
return new DateTime(int.Parse(split[1]), int.Parse(split[0]), 1);
});
您的最后一项将是"01/2013"
。
正如MethodMan在答案中所示,DateTime.Parse()
将能够解析MM/yyyy
格式化日期。但是,如果您需要执行任何需要多行的操作,那么就可以执行此操作。 NB:这将 不 在针对DbContext的任何查询中工作!
答案 2 :(得分:0)
实施System.IComparable接口:
public int CompareTo(object obj)
{
// Check null
if (obj == null)
return 1;
// Check types
if (this.GetType() != obj.GetType())
throw new ArgumentException("Cannot compare to different type.", "obj");
// Extract year and month
var year = int.Parse(this.Year.SubString(3, 4));
var month = int.Parse(this.Year.SubString(0, 2));
// Extract year and month to compare
var site = (Sites)obj;
var objyear = int.Parse(site.Year.SubString(3, 4));
var objmonth = int.Parse(site.Year.SubString(0, 2));
// Compare years first
if (year != objyear)
return year - objyear;
// Same year
// Compare months
return month - objmonth;
}
答案 3 :(得分:-1)
您还可以创建一个新的列表,其中日期转换为DateTime格式并在之后进行排序。它有很多系,但对学习有好处。
class Sites
{
public string Year { get; set; }
}
class MainClass
{
static void Main()
{
List<Sites> ListOfSites = new List<Sites>();
ListOfSites.Add(new Sites { Year = "01/2012" });
ListOfSites.Add(new Sites { Year = "04/2012" });
ListOfSites.Add(new Sites { Year = "01/2013" });
ListOfSites.Add(new Sites { Year = "06/2012" });
DateTime SiteYear;
List<DateTime> listWithDates = new List<DateTime>();
foreach (var item in ListOfSites)
{
if(DateTime.TryParse(item.Year, out SiteYear))
{
listWithDates.Add(SiteYear);
}
}
Display(SortAscending(listWithDates), "Sort Ascending");
}
static List<DateTime> SortAscending(List<DateTime> list)
{
list.Sort((a, b) => a.CompareTo(b));
return list;
}
static void Display(List<DateTime> list, string message)
{
Console.WriteLine(message);
foreach (var datetime in list)
{
Console.WriteLine(datetime);
}
Console.WriteLine();
}
}