Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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# - Fatal编程技术网

C# 将一个数组与另一个数组排序';只有一天

C# 将一个数组与另一个数组排序';只有一天,c#,C#,我有Visual Studio 2019。该项目是C#on.NETFramework4.8上的.NETWindows窗体 我有两个数组 第一个包含随机数目的字符串值(因为它们来自字符串[]),例如: AB5XHBC1 NMAK72B8 WB5XHBC1 KCZUH528 NZ9YHF3D PFKR6WNA 第二个值的长度始终与第一个值相同,但它们的值是日期字符串,可能是某个字符串。在某些情况下为空或重复值: 06/10/2020 08/05/2018 01/12/2020 01/01/200

我有Visual Studio 2019。该项目是C#on.NETFramework4.8上的.NETWindows窗体

我有两个数组

第一个包含随机数目的字符串值(因为它们来自字符串[]),例如:

AB5XHBC1
NMAK72B8
WB5XHBC1
KCZUH528
NZ9YHF3D
PFKR6WNA
第二个值的长度始终与第一个值相同,但它们的值是日期字符串,可能是某个字符串。在某些情况下为空或重复值:

06/10/2020
08/05/2018

01/12/2020
01/01/2009
01/12/2020
我需要做的是根据第二个数组对第一个数组进行排序。我尝试了Array.Sort方法,但没有得到预期的结果。我不确定我是否用错了

“null”值必须是第一个,然后是较新的日期(在顶部)到较旧的日期(在底部),因此此示例的结果数组必须按如下方式排序(从0到5位置):


提前感谢。

您可以将它们存储在
元组的
列表中。我已经硬编码了下面示例中的值-正如其他评论者所说,您需要正确地将日期字符串解析为适当的
DateTime
对象等。我将此练习留给您

var list = new List<(string RandomString, DateTime Date)>
{
    ("AB5XHBC1", DateTime.Parse("06/10/2020")),
    ("NMAK72B8", DateTime.Parse("08/05/2018")),
    ("WB5XHBC1", DateTime.MaxValue), // simulating null, see below
    ("KCZUH528", DateTime.Parse("01/12/2020")),
    ("NZ9YHF3D", DateTime.Parse("01/01/2009")),
    ("PFKR6WNA", DateTime.Parse("01/12/2020")),
};

var sorted = list.OrderByDescending(x => x.Date);

这将为您指明正确的方向,这将是一个更加优雅和完整的解决方案。

您可以为日期实现一个比较器(应该实现
IComparer
),然后像这样使用:

我相信这是因为你的预期结果有一个错误。第二个最早的日期是“08/05/2018”,对应于字符串“NMAK72B8”。因此,根据您的规范,“NMAK72B8”应该是从末尾算起的第二个,但在您的预期结果中,“AB5XHBC1”是从末尾算起的第二个

(.Net Fiddle)


需要注意的一件事是日期解析。上面的代码解析当前区域设置中的日期,该区域设置假定为UK(对于dd/mm/yyyy日期格式)。如果要解析其他日期格式,则必须相应地更改代码。

如果两种格式中的数据量相同,只需创建一个元组列表,然后使用Linq对其排序。日期没有格式,它们是二进制值。该列表中的字符串不能按时间顺序排序。您必须使用ISO8601格式(YYYY-MM-DD),或存储日期时间值。无法猜测本地化格式是-MM/DD还是DD/MM?您可以使用
DateTime.Parse
将字符串转换为日期,但需要知道格式是什么used@MathewHD对不起,我对linq没有任何了解,我是一个老的开发者。如果你能给我一个示例代码,我可以试试。@PanagiotisKanavos日期格式是我所在国家的默认格式:DD/MM/YYYYThanks,它有效。不要介意“预期结果”,我用假数据写的。在我的真实环境中,您的解决方案非常有效。谢谢您的回答!
var list = new List<(string RandomString, DateTime Date)>
{
    ("AB5XHBC1", DateTime.Parse("06/10/2020")),
    ("NMAK72B8", DateTime.Parse("08/05/2018")),
    ("WB5XHBC1", DateTime.MaxValue), // simulating null, see below
    ("KCZUH528", DateTime.Parse("01/12/2020")),
    ("NZ9YHF3D", DateTime.Parse("01/01/2009")),
    ("PFKR6WNA", DateTime.Parse("01/12/2020")),
};

var sorted = list.OrderByDescending(x => x.Date);
string.IsNullOrEmpty(whateverStringDate) ? DateTime.MaxValue : DateTime.Parse(whateverStringDate);
using System;
using System.Collections.Generic;

namespace Demo
{
    static class Program
    {
        public static void Main()
        {
            string[] data = 
            {
                "AB5XHBC1",
                "NMAK72B8",
                "WB5XHBC1",
                "KCZUH528",
                "NZ9YHF3D",
                "PFKR6WNA"
            };

            string[] dates =
            {
                "06/10/2020",
                "08/05/2018",
                "",
                "01/12/2020",
                "01/01/2009",
                "01/12/2020"
            };

            Array.Sort(dates, data, new CompareDates());

            Console.WriteLine(string.Join("\n", data));
        }
    }

    public sealed class CompareDates: IComparer<string>
    {
        public int Compare(string x, string y)
        {
            var xd = DateTime.TryParse(x, out DateTime d1) ? d1 : DateTime.MaxValue;
            var yd = DateTime.TryParse(y, out DateTime d2) ? d2 : DateTime.MaxValue;

            return yd.CompareTo(xd);
        }
    }
}           
WB5XHBC1
KCZUH528
PFKR6WNA
AB5XHBC1
NMAK72B8
NZ9YHF3D