列表列表按字符串日期排序?

时间:2010-06-28 15:28:42

标签: c# list

我有一个字符串列表列表,其中包含转换为字符串的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

6 个答案:

答案 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。只有正确解析之后,您的比较才能正确完成。