我有一个字符串列表列表,其中包含转换为字符串的DateTime值。列表中还有其他值,因此我无法使列表成为完整的DateTime列表。
我有一行代码对列表进行排序,但它按字符串值排序日期,而不是DateTime值(这就是我想要的)。如何修改我的代码以按DateTime正确排序?
//This sorts the parent list by the 2nd column of the child list
List.Sort((a, b) => -1 * a[1].CompareTo(b[1]));
编辑:
样本列表内容:
Value1,2010-06-28 10:30:00.000
Value2,2010-06-27 10:30:00.000
Value2,2010-06-26 10:30:00.000
答案 0 :(得分:6)
尝试使用folloting
List.Sort((a,b) => -1 * DateTime.Parse(a[1]).CompareTo(DateTime.Parse(b[1])));
或者如果您有方便的LINQ并且不需要就地排序
var sorted = myList.OrderBy(x => DateTime.Parse(x[1]));
答案 1 :(得分:2)
您应该创建自己的自定义比较器。
class Program
{
static void Main(string[] args)
{
List<string> list = new List<string>
{
"Value1, 2010-06-28 10:30:00.000",
"Value2, 2010-06-27 10:30:00.000",
"Value3, 2010-06-26 10:30:00.000"
};
list.Sort(new MyComparer());
}
}
internal class MyComparer : IComparer<string>
{
public int Compare(string x, string y)
{
var xItems = x.Split(new []{','});
var yItems = y.Split(new []{','});
var xDateTime = DateTime.Parse(xItems[1]);
var yDateTime = DateTime.Parse(yItems[1]);
return xDateTime.CompareTo(yDateTime);
}
}
答案 2 :(得分:0)
首先将字符串解析为DateTime。假设第二列总是一个格式正确的日期/时间字符串。下面的代码使用Linq创建一个单独的排序列表:
sortedList = yourList.OrderBy( item => DateTime.Parse( item[1] ) ).ToList();
如果您需要进行排序,可以使用以下方式进行排序:
List.Sort((a,b)=>return DateTime.Parse(b[1]).CompareTo(DateTime.Parse(a[1]) );
根据您的约会日期,您可能需要考虑使用DateTime.ParseExact()
。
答案 3 :(得分:0)
在比较之前,您需要将[1]转换为日期时间。
List.Sort((a, b) => -1 * DateTime.Parse(a[1]).CompareTo(DateTime.Parse(b[1])))
编辑:
如果填充列表的LINQ查询将其填充为字符串列表,则需要获取表示字符串日期部分的项的子字符串。 DateTime.Parse不会只是神奇地挑选出具有日期值的字符串部分。
如果是这种情况并且您正在考虑使用string.Split
,请确保您知道日期的格式,因为某些格式允许使用逗号。
答案 4 :(得分:0)
也许像
List<string> list = new List<string>
{
"Value1, 2010-06-28 10:30:00.000",
"Value2, 2010-06-27 10:30:00.000",
"Value3, 2010-06-26 10:30:00.000"
};
list.Sort((a, b) =>
{
string[] aSplit = a.Split(',');
string[] bSplit = b.Split(',');
if (aSplit.Count() < 2 && bSplit.Count() < 2)
return a.CompareTo(b);
DateTime date1, date2;
if (!DateTime.TryParse(aSplit[1].Trim(), out date1) ||
!DateTime.TryParse(bSplit[1].Trim(), out date2))
return a.CompareTo(b);
return date2.CompareTo(date1);
});
答案 5 :(得分:0)
如果您的字符串中包含日期以外的其他内容,那么我强烈建议您将字符串拆分为仅日期部分,然后尝试使用TryParse并比较该值。不是整个字符串!
yourStringList.Sort(
(x, y) => {
DateTime ix;
DateTime iy;
DateTime.TryParse(x.Split('(')[2].Split(')')[0], out ix);
DateTime.TryParse(y.Split('(')[2].Split(')')[0], out iy);
return ix.CompareTo(iy);
}
);
在此示例中,将我的字符串精确地拆分为日期所在的部分,并在其上使用tryparse。只有正确解析之后,您的比较才能正确完成。