2010-06-28 62 views
3

我有一个包含日期时间值转换为字符串的字符串列表的列表。列表中还有其他值,因此我无法将列表设置为完整的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])); 

编辑:

样品清单内容:
值1,2010-06-28 10:30:00.000
值2,2010-06-27 10:30:00.000
值2,2010 -06-26 10:30:00.000

+0

可您发布名单的一些内容? – 2010-06-28 15:36:45

+0

我在原帖中添加了一些示例列表内容 – sooprise 2010-06-28 15:39:08

+0

您的列表内容是字符串吗?你正在访问它,就像它是一个字符串数组。 – 2010-06-28 15:52:54

回答

6

尝试folloting

List.Sort((a,b) => -1 * DateTime.Parse(a[1]).CompareTo(DateTime.Parse(b[1]))); 

或者,如果你为L INQ方便且不需要现场排序

var sorted = myList.OrderBy(x => DateTime.Parse(x[1])); 
+1

DateTime.Parse引发以下错误:字符串未被识别为有效的DateTime。 我是否需要将DateTime重新转换为字符串? – sooprise 2010-06-28 15:45:22

+0

@Soo那么你的集合中的字符串实际上不是你指定的问题的日期时间(或者它们是无法识别的格式)。这些字符串是如何进入这个数据结构的?你能告诉我们一些代码吗? – JaredPar 2010-06-28 16:06:13

+0

数据格式来自获取SQL数据库结果的LINQ查询。不应该C#能够识别日期格式吗?我很困惑... – sooprise 2010-06-28 16:18:36

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])); 

根据您的日期的repsented,你可能想要考虑使用DateTime.ParseExact()

+0

考虑我的日期的格式设置: YYYY-MM-DD HH:MM:ss.mmm 我将如何使用ParseExact(),使这项工作正常? – sooprise 2010-06-28 17:07:34

0

您需要在比较之前将[1]转换为日期时间。

List.Sort((a, b) => -1 * DateTime.Parse(a[1]).CompareTo(DateTime.Parse(b[1]))) 

编辑:

如果填充列表中的LINQ查询填充它作为一个字符串列表,那么你需要获取表示字符串的日期部分项目的子字符串。 DateTime.Parse不会奇迹般地挑出其中包含日期值的字符串部分。

如果是这种情况,并且您正在考虑使用string.Split,请确保您知道日期的格式,因为某些格式允许使用逗号。

+0

让我看看我是否理解正确。 a [1]和b [1]表示每个子列表中的第二个值,它们应该是DateTime项目本身。在这种情况下不应该使用DateTime.Parse(不是)。我不确定为什么DateTime.Parse不工作,因为(据我了解)a [1]和b [1]已经是日期字符串。 – sooprise 2010-06-28 18:16:07

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); 
    } 
} 
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); 
    });