Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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#_Arrays_Sorting - Fatal编程技术网

C#数组。对不一致的结果进行排序

C#数组。对不一致的结果进行排序,c#,arrays,sorting,C#,Arrays,Sorting,我正在尝试对制表符分隔的字符串数组进行排序。我对每个元素的制表符调用split函数,将字符串拆分为字符串数组。然后,我对date元素进行比较,以返回它们应该处于的顺序。如果日期相等,我会对字符串字段进行二次比较。我对IComparer接口的实现如下所示: class CompareLines : IComparer<string> { public int Compare(string x, string y) { string[] bSplitX =

我正在尝试对制表符分隔的字符串数组进行排序。我对每个元素的制表符调用split函数,将字符串拆分为字符串数组。然后,我对date元素进行比较,以返回它们应该处于的顺序。如果日期相等,我会对字符串字段进行二次比较。我对IComparer接口的实现如下所示:

class CompareLines : IComparer<string>
{
    public int Compare(string x, string y)
    {
        string[] bSplitX = x.Split('\t');
        string[] bSplitY = y.Split('\t');

        int bYearX = Int32.Parse(bSplitX[4].Substring(4, 4));
        int bMonthX = Int32.Parse(bSplitX[4].Substring(0, 2));
        int bDayX = Int32.Parse(bSplitX[4].Substring(2, 2));

        int bYearY = Int32.Parse(bSplitY[4].Substring(4, 4));
        int bMonthY = Int32.Parse(bSplitY[4].Substring(0, 2));
        int bDayY = Int32.Parse(bSplitY[4].Substring(2, 2));

        DateTime bTempDateX = new DateTime(bYearX, bMonthX, bDayX);
        DateTime bTempDateY = new DateTime(bYearY, bMonthY, bDayY);

        if (DateTime.Compare(bTempDateX, bTempDateY) > 0)
        {
            return 1;
        }
        else if (DateTime.Compare(bTempDateX, bTempDateY) < 0)
        {
            return -1;
        }
        else if (DateTime.Compare(bTempDateX, bTempDateY) == 0)
        {
            if (String.Compare(bSplitX[3], bSplitY[3]) > 0)
            {
                return 1;
            }
            else
            {
                return -1;
            }
        }
        else
        {
            Console.WriteLine("ahhh wtf"); //should never be reached. This message has never appeared in my console.
            return 0;
        }
    }
}
类比较器:IComparer
{
公共整数比较(字符串x、字符串y)
{
字符串[]bSplitX=x.Split('\t');
字符串[]bSplitY=y.Split('\t');
int bYearX=Int32.Parse(bSplitX[4].子字符串(4,4));
intbmonthx=Int32.Parse(bSplitX[4].子字符串(0,2));
intbdayx=Int32.Parse(bSplitX[4].子字符串(2,2));
int bYearY=Int32.Parse(bSplitY[4].子字符串(4,4));
int bmmonthy=Int32.Parse(bSplitY[4].子字符串(0,2));
intbdayy=Int32.Parse(bSplitY[4]。子字符串(2,2));
DateTime bTempDateX=新日期时间(bYearX、bMonthX、bDayX);
DateTime bTempDateY=新日期时间(早、月、日);
if(DateTime.Compare(bTempDateX,bTempDateY)>0)
{
返回1;
}
else if(DateTime.Compare(bTempDateX,bTempDateY)<0)
{
返回-1;
}
else if(DateTime.Compare(bTempDateX,bTempDateY)==0)
{
if(String.Compare(bSplitX[3],bSplitY[3])>0)
{
返回1;
}
其他的
{
返回-1;
}
}
其他的
{
Console.WriteLine(“ahhh wtf”);//不应被访问。此消息从未出现在我的控制台中。
返回0;
}
}
}
我的问题是它有时会起作用,而其他的则不会。是否有人有任何理由说明上述代码在所有情况下都无法正常工作

这已经伤害了我的大脑好几天了,我真的不明白为什么它不工作。

换一个怎么样

if (String.Compare(bSplitX[3], bSplitY[3]) > 0) {
  return 1;
} else {
  return -1;
}

在X和Y字符串相等的情况下,当前代码表示Y小于X。 下面是ParseExact方法的代码

class CompareLines : IComparer<string>
{
    public int Compare(string x, string y)
    {
        string[] bSplitX = x.Split('\t');
        string[] bSplitY = y.Split('\t');

        DateTime bTempDateX = DateTime.ParseExact(bSplitX[4], "MMddyyyy", null);
        DateTime bTempDateY = DateTime.ParseExact(bSplitY[4], "MMddyyyy", null);

        if (DateTime.Compare(bTempDateX, bTempDateY) > 0)
            return 1;
        else if (DateTime.Compare(bTempDateX, bTempDateY) < 0)
            return -1;
        else
            return String.Compare(bSplitX[3], bSplitY[3]);
    }
}
类比较器:IComparer
{
公共整数比较(字符串x、字符串y)
{
字符串[]bSplitX=x.Split('\t');
字符串[]bSplitY=y.Split('\t');
DateTime bTempDateX=DateTime.ParseExact(bSplitX[4],“MMddyyyy”,null);
DateTime bTempDateY=DateTime.ParseExact(bsply[4],“MMddyyyy”,null);
if(DateTime.Compare(bTempDateX,bTempDateY)>0)
返回1;
else if(DateTime.Compare(bTempDateX,bTempDateY)<0)
返回-1;
其他的
返回String.Compare(bSplitX[3],bSplitY[3]);
}
}
更换怎么样

if (String.Compare(bSplitX[3], bSplitY[3]) > 0) {
  return 1;
} else {
  return -1;
}

在X和Y字符串相等的情况下,当前代码表示Y小于X。 下面是ParseExact方法的代码

class CompareLines : IComparer<string>
{
    public int Compare(string x, string y)
    {
        string[] bSplitX = x.Split('\t');
        string[] bSplitY = y.Split('\t');

        DateTime bTempDateX = DateTime.ParseExact(bSplitX[4], "MMddyyyy", null);
        DateTime bTempDateY = DateTime.ParseExact(bSplitY[4], "MMddyyyy", null);

        if (DateTime.Compare(bTempDateX, bTempDateY) > 0)
            return 1;
        else if (DateTime.Compare(bTempDateX, bTempDateY) < 0)
            return -1;
        else
            return String.Compare(bSplitX[3], bSplitY[3]);
    }
}
类比较器:IComparer
{
公共整数比较(字符串x、字符串y)
{
字符串[]bSplitX=x.Split('\t');
字符串[]bSplitY=y.Split('\t');
DateTime bTempDateX=DateTime.ParseExact(bSplitX[4],“MMddyyyy”,null);
DateTime bTempDateY=DateTime.ParseExact(bsply[4],“MMddyyyy”,null);
if(DateTime.Compare(bTempDateX,bTempDateY)>0)
返回1;
else if(DateTime.Compare(bTempDateX,bTempDateY)<0)
返回-1;
其他的
返回String.Compare(bSplitX[3],bSplitY[3]);
}
}

我看到的唯一漏洞是,如果日期和字符串相同,则不返回0:

        if (String.Compare(bSplitX[3], bSplitY[3]) > 0) {
            return 1;
        } else {
            return -1;  // if they are equal it will return -1.
        }
这将摆脱排序程序

这里有一个更简洁的版本:

   int dateCompare = DateTime.Compare(bTempDateX, bTempDateY);

   if (dateCompare == 0) 
        return String.Compare(bSplitX[3], bSplitY[3]);
   else
       return dateCompare ;

我看到的唯一漏洞是,如果日期和字符串相同,则不返回0:

        if (String.Compare(bSplitX[3], bSplitY[3]) > 0) {
            return 1;
        } else {
            return -1;  // if they are equal it will return -1.
        }
这将摆脱排序程序

这里有一个更简洁的版本:

   int dateCompare = DateTime.Compare(bTempDateX, bTempDateY);

   if (dateCompare == 0) 
        return String.Compare(bSplitX[3], bSplitY[3]);
   else
       return dateCompare ;

首先,您不需要重写框架中内置的比较逻辑,只要您第一手正确地设置数据,它就已经返回您期望的结果。正如Jon所建议的,只需解析日期,然后返回日期的比较。我添加了一个属性IncomingFormat,考虑到您的输入,它可能没有用处

编辑:更简洁/清晰:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;

namespace ConsoleApplication1
{
    public class CompareLines : IComparer<string>
    {
        public string IncomingFormat { get; set; }

        public int Compare(string first, string second)
        {
            var date1 = DateTime.ParseExact(first, IncomingFormat, CultureInfo.InvariantCulture);
            var date2 = DateTime.ParseExact(second, IncomingFormat, CultureInfo.InvariantCulture);

            return date1.CompareTo(date2);
        }
    }

    internal class Program
    {
        private static void Main()
        {
            const string dataFormat = "MM\tdd\tyyyy";

            var comparer = new CompareLines
            {
                IncomingFormat = dataFormat
            };

            int result;
            string date1, date2;

            date1 = DateTime.Parse("1/1/2000").ToString(dataFormat);
            date2 = DateTime.Parse("1/1/2000").ToString(dataFormat);
            result = comparer.Compare(date1, date2);
            Debug.Assert(result == 0);
            Console.WriteLine("{0} compare {1} = {2}", date1, date2, result);

            date1 = DateTime.Parse("1/1/2000").ToString(dataFormat);
            date2 = DateTime.Parse("1/2/2000").ToString(dataFormat);
            result = comparer.Compare(date1, date2);
            Debug.Assert(result == -1);
            Console.WriteLine("{0} compare {1} = {2}", date1, date2, result);

            date1 = DateTime.Parse("1/2/2000").ToString(dataFormat);
            date2 = DateTime.Parse("1/1/2000").ToString(dataFormat);
            result = comparer.Compare(date1, date2);
            Debug.Assert(result == 1);
            Console.WriteLine("{0} compare {1} = {2}", date1, date2, result);

            Console.ReadLine();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统诊断;
利用制度全球化;
命名空间控制台应用程序1
{
公共类比较:IComparer
{
公共字符串输入格式{get;set;}
公共整数比较(字符串第一,字符串第二)
{
var date1=DateTime.ParseExact(第一个是IncomingFormat,CultureInfo.InvariantCulture);
var date2=DateTime.ParseExact(第二个,IncomingFormat,CultureInfo.InvariantCulture);
返回日期1.与(日期2)相比;
}
}
内部课程计划
{
私有静态void Main()
{
常量字符串dataFormat=“MM\tdd\tyyyy”;
变量比较器=新比较器线
{
IncomingFormat=数据格式
};
int结果;
字符串date1,date2;
date1=DateTime.Parse(“1/1/2000”).ToString(数据格式);
date2=DateTime.Parse(“1/1/2000”).ToString(数据格式);
结果=比较器。比较(日期1,日期2);
Assert(result==0);
WriteLine(“{0}比较{1}={2}”,date1,date2,result);
date1=DateTime.Parse(“1/1/2000”).ToString(数据格式);
date2=DateTime.Parse(“1/2/2000”).ToString(数据格式);
结果=比较器。比较(日期1,日期2);
Assert(结果==-1);
WriteLine(“{0}比较{1}={2}”,date1,date2,result);
date1=DateTime.Parse(“1/2/2000”).ToString(数据格式);
date2=DateTime.Parse(“1/1/2000”).ToString(数据格式);
结果=比较器。比较(日期1,日期2);
Assert(result==1);