在c#中将字符串转换为MM/yyyy进行排序
Convert string to MM/yyyy in c# to sort
我以前看过与我的查询相关的问题,但无法弄清楚如何解决我的问题。
我有一个列表 "Sites",其中一项为 "Year"。它被定义为字符串,格式为 "MM/yyyy"。当我尝试根据年份对列表进行排序时,我遇到了一个小问题。
"Year" 的数据是
01/2012
04/2012
01/2013
06/2012
当我使用 orderby 对列表进行排序时,我得到的输出是
01/2012
01/2013
04/2012
06/2012
这是不正确的。
无法使用 Convert.ToDateTime
转换字符串,因为字符串格式不包含日期值。我应该如何推进这件事?如何在不改变字符串格式的情况下实现DateTime.TryParseExact
?
注意:格式要一致,列表要排序。
您可以在不更改输入的情况下尝试这样的操作,这将为您提供您喜欢的顺序,如果您需要不同的排序顺序,还可以查看 OrderByDescending
属性
var dateList = new List<string> { "01/2012", "04/2012", "01/2013", "06/2012" };
var orderedList = dateList.OrderBy(x => DateTime.Parse(x)).ToList();
您仍然可以在 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
格式的日期。但是,如果您需要执行任何需要多行的操作,这就是您可以做到的。 注意:这将不会在针对 DbContext 的任何查询中工作!
实现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;
}
您还可以创建一个新列表,将日期转换为日期时间格式,然后对其进行排序。台词很多,但很适合学习。
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();
}
}
我以前看过与我的查询相关的问题,但无法弄清楚如何解决我的问题。
我有一个列表 "Sites",其中一项为 "Year"。它被定义为字符串,格式为 "MM/yyyy"。当我尝试根据年份对列表进行排序时,我遇到了一个小问题。
"Year" 的数据是
01/2012
04/2012
01/2013
06/2012
当我使用 orderby 对列表进行排序时,我得到的输出是
01/2012
01/2013
04/2012
06/2012
这是不正确的。
无法使用 Convert.ToDateTime
转换字符串,因为字符串格式不包含日期值。我应该如何推进这件事?如何在不改变字符串格式的情况下实现DateTime.TryParseExact
?
注意:格式要一致,列表要排序。
您可以在不更改输入的情况下尝试这样的操作,这将为您提供您喜欢的顺序,如果您需要不同的排序顺序,还可以查看 OrderByDescending
属性
var dateList = new List<string> { "01/2012", "04/2012", "01/2013", "06/2012" };
var orderedList = dateList.OrderBy(x => DateTime.Parse(x)).ToList();
您仍然可以在 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
格式的日期。但是,如果您需要执行任何需要多行的操作,这就是您可以做到的。 注意:这将不会在针对 DbContext 的任何查询中工作!
实现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;
}
您还可以创建一个新列表,将日期转换为日期时间格式,然后对其进行排序。台词很多,但很适合学习。
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();
}
}