Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表列表是否使用字符串日期排序?_C#_List - Fatal编程技术网

C# 列表列表是否使用字符串日期排序?

C# 列表列表是否使用字符串日期排序?,c#,list,C#,List,我有一个字符串列表,其中包含转换为字符串的日期时间值。列表中还有其他值,因此我无法使该列表成为完整的日期时间列表 我有一行代码对列表进行排序,但它按日期的字符串值排序,而不是按日期时间值排序(这正是我想要的)。如何修改代码以按日期时间正确排序 //This sorts the parent list by the 2nd column of the child list List.Sort((a, b) => -1 * a[1].CompareTo(b[1])); 编辑: 样本列表内容:

我有一个字符串列表,其中包含转换为字符串的日期时间值。列表中还有其他值,因此我无法使该列表成为完整的日期时间列表

我有一行代码对列表进行排序,但它按日期的字符串值排序,而不是按日期时间值排序(这正是我想要的)。如何修改代码以按日期时间正确排序

//This sorts the parent list by the 2nd column of the child list
List.Sort((a, b) => -1 * a[1].CompareTo(b[1]));
编辑:

样本列表内容:
value12010-06-2810:30:00.000
2010年6月27日10:30:00.000 Value220010-06-26 10:30:00.000尝试以下操作

List.Sort((a,b) => -1 * DateTime.Parse(a[1]).CompareTo(DateTime.Parse(b[1])));
或者如果你手边有LINQ,不需要就地排序

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

首先将字符串解析为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.PARSECORTETHER()/<代码>

< p>您需要在比较之前将[1 ]转换为日期。p>
List.Sort((a, b) => -1 * DateTime.Parse(a[1]).CompareTo(DateTime.Parse(b[1])))
编辑:

如果填充列表的LINQ查询将其填充为字符串列表,则需要获取表示字符串日期部分的项的子字符串。Parse不会神奇地挑出字符串中包含日期值的部分


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

您应该创建自己的自定义比较器

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);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
列表=新列表
{
“Value12010-06-2810:30:00.000”,
“Value220010-06-27 10:30:00.000”,
“Value320010-06-26 10:30:00.000”
};
list.Sort(新的MyComparer());
}
}
内部类MyComparer:IComparer
{
公共整数比较(字符串x、字符串y)
{
var xItems=x.Split(新[]{',});
var yItems=y.Split(新[]{',});
var xDateTime=DateTime.Parse(xItems[1]);
var yDateTime=DateTime.Parse(yItems[1]);
返回xDateTime.CompareTo(yDateTime);
}
}
可能类似

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);
    });
List List=新列表
{
“Value12010-06-2810:30:00.000”,
“Value220010-06-27 10:30:00.000”,
“Value320010-06-26 10:30:00.000”
};
列表.排序((a,b)=>
{
字符串[]aSplit=a.Split(',');
字符串[]bSplit=b.Split(',');
if(aSplit.Count()<2&&bSplit.Count()<2)
返回a.CompareTo(b);
日期时间日期1,日期2;
如果(!DateTime.TryParse(aSplit[1].Trim(),out date1)|
!DateTime.TryParse(bSplit[1].Trim(),out date2))
返回a.CompareTo(b);
返回日期2.与(日期1)相比;
});

如果字符串包含日期以外的内容,我强烈建议将字符串拆分为日期部分,然后对该值进行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处理该部分。只有在正确解析后,才能正确地进行比较。

您可以发布列表的一些内容吗?我在原始post中添加了一些示例列表内容。您的列表内容是字符串吗?您正在像访问字符串数组一样访问它。DateTime.Parse抛出以下错误:字符串未被识别为有效的DateTime。我需要将日期时间重新转换为字符串吗?@Soo那么您集合中的字符串实际上不是您指定的问题的日期时间(或者它们的格式无法识别)。这些字符串是如何进入这个数据结构的?您能给我们看一些代码吗?数据格式来自一个LINQ查询,该查询从SQL数据库获取结果。难道C#无论如何都不能识别日期格式吗?我很困惑…@JaredPar:你的意思是使用
OrderBy
而不是
Sort
作为LINQ建议吗?考虑到我的日期是如何格式化的:yyyy-mm-dd hh:mm:ss.mmm如何使用ParseExact()使其正常工作?让我看看我是否理解正确。a[1]和b[1]表示每个子列表中的第二个值,它们本身应该是日期时间项。不应该使用DateTime.Parse,在这种情况下,它可以工作(不是)。我不知道为什么DateTime.Parse不起作用,因为(据我所知)a[1]和b[1]已经是日期字符串了。