C# 谁能解释一下string.Join连接的顺序吗?

C# 谁能解释一下string.Join连接的顺序吗?,c#,.net,C#,.net,以下是输入文件内容: Time,MW 01/01/2014 1:00:00 AM,2617 01/01/2014 2:00:00 AM,2544 01/01/2014 3:00:00 AM,2458 01/01/2014 4:00:00 AM,2395 01/01/2014 5:00:00 AM,2349 01/01/2014 6:00:00 AM,2375 01/01/2014 7:00:00 AM,2359 01/01/2014 8:00:00 AM,2418 ... 这里是期望的输出:其

以下是输入文件内容:

Time,MW
01/01/2014 1:00:00 AM,2617
01/01/2014 2:00:00 AM,2544
01/01/2014 3:00:00 AM,2458
01/01/2014 4:00:00 AM,2395
01/01/2014 5:00:00 AM,2349
01/01/2014 6:00:00 AM,2375
01/01/2014 7:00:00 AM,2359
01/01/2014 8:00:00 AM,2418
...
这里是期望的输出:其中工作日=1,周末=0,冬季=1,中期=2,夏季=3

Time,MW,Hour,Weekday,Season
01/01/2014 1:00:00 AM,2617,1,1,1
01/01/2014 2:00:00 AM,2544,2,1,1
01/01/2014 3:00:00 AM,2458,3,1,1
01/01/2014 4:00:00 AM,2395,4,1,1
01/01/2014 5:00:00 AM,2349,5,1,1
01/01/2014 6:00:00 AM,2375,6,1,1
01/01/2014 7:00:00 AM,2359,7,1,1
01/01/2014 8:00:00 AM,2418,8,1,1
...
代码如下:

var inLines = File.ReadAllText(IN_CSV).Split('\n');
var outLines = new List<string>();
outLines.Add(OUT_CSV_HEADER);
foreach (var line in inLines)
{
    if (line.Contains("Time,MW")) continue;
    List<string> ocl = BuildOutCsvLine(line);
    var oclFinal = "";
    ocl.ForEach(o => {
        System.Console.WriteLine(o);
        oclFinal = string.Join(",", oclFinal, o);
    });
    System.Console.WriteLine(oclFinal);
    break;
    //outLines.Add(ocl);
}
private static List<string> BuildOutCsvLine(string inCsvLine) {
    var inCsvData = inCsvLine.Split(',');
    var timestamp = DateTime.ParseExact(inCsvData[0], "dd/MM/yyyy h:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture);
    var season = seasons.GetSeason(timestamp);
    var tod = timestamp.Hour.ToString();
    var wd = ((int)timestamp.GetWeekDayType()).ToString();
    var ssn = ((int)season.Id).ToString();

    return new List<string> { inCsvLine, tod, wd, ssn };
}
我还尝试了
StringBuilder
附加所有元素并创建CSV字符串,但产生了相同的结果

是否存在我必须使用的格式问题(例如,
CultureInfo.InvariantCulture
等)?我尝试了
InvariantCulture
,但结果相同


我怀疑.NET framefwork,我需要应用一些补丁吗?

您正在尝试的是,将ocl列表元素连接到oclFinal中

List<string> ocl = BuildOutCsvLine(line);
var oclFinal = "";
ocl.ForEach(o => {
    System.Console.WriteLine(o);
    oclFinal = string.Join(",", oclFinal, o);
});
List ocl=BuildOutCsvLine(行);
var oclFinal=“”;
ocl.ForEach(o=>{
系统控制台写入线(o);
oclFinal=string.Join(“,”,oclFinal,o);
});
你可以这样做

List<string> ocl = BuildOutCsvLine(line);
var oclFinal = "";
oclFinal=string.Join(",",ocl);
List ocl=BuildOutCsvLine(行);
var oclFinal=“”;
oclFinal=string.Join(“,”,ocl);

您正在尝试的是,将ocl列表元素串联到oclFinal中

List<string> ocl = BuildOutCsvLine(line);
var oclFinal = "";
ocl.ForEach(o => {
    System.Console.WriteLine(o);
    oclFinal = string.Join(",", oclFinal, o);
});
List ocl=BuildOutCsvLine(行);
var oclFinal=“”;
ocl.ForEach(o=>{
系统控制台写入线(o);
oclFinal=string.Join(“,”,oclFinal,o);
});
你可以这样做

List<string> ocl = BuildOutCsvLine(line);
var oclFinal = "";
oclFinal=string.Join(",",ocl);
List ocl=BuildOutCsvLine(行);
var oclFinal=“”;
oclFinal=string.Join(“,”,ocl);

string.Join()的顺序与您提供的元素顺序相同。Net不会在内部更改顺序。

string.Join()的顺序与您提供的元素顺序相同。Net不会在内部更改顺序。

请尝试此代码,尽管我无法完全测试它,因为您没有提供完整的代码。特别是,季节对我来说是没有定义的

对不起,更新了。错放的代码

var inLines = File.ReadAllText(IN_CSV).Split('\n');
var outLines = new List<string>();
outLines.Add(OUT_CSV_HEADER);
foreach (var line in inLines)
{
    if (line.Contains("Time,MW")) continue;
    List<string> ocl = BuildOutCsvLine(line);
    var oclFinal = "";
    ocl.ForEach(o => {
        oclFinal = string.Join(",", oclFinal, o);
    });
    System.Console.WriteLine(oclFinal);
}
    private static List<string> BuildOutCsvLine(string inCsvLine)
    {
        var clearR = inCsvLine.Replace("\r", "");
        var clearN = clearR.Replace("\n", "");
        var inCsvData = clearN.Split(',');
        var timestamp = DateTime.ParseExact(inCsvData[0], "dd/MM/yyyy h:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture);
        var season = seasons.GetSeason(timestamp);
        var tod = timestamp.Hour.ToString();
        var wd = ((int)timestamp.GetWeekDayType()).ToString();
        var ssn = ((int)season.Id).ToString();

        return new List<string> { clearN, tod, wd, ssn };
    }
var inLines=File.ReadAllText(在CSV.Split('\n');
var outLines=新列表();
大纲。添加(OUT_CSV_标题);
foreach(内联线中的var行)
{
如果(行包含(“时间,MW”))继续;
列表ocl=建筑CSVLINE(线);
var oclFinal=“”;
ocl.ForEach(o=>{
oclFinal=string.Join(“,”,oclFinal,o);
});
系统控制台写入线(oclFinal);
}
私有静态列表构建CSVLINE(字符串inCsvLine)
{
var clearR=inCsvLine.Replace(“\r”,”);
var clearN=clearR.Replace(“\n”,”);
var inCsvData=clearN.Split(',');
var timestamp=DateTime.ParseExact(inCsvData[0],“dd/MM/yyyy h:MM:ss tt”,System.Globalization.CultureInfo.InvariantCulture);
var season=seasons.GetSeason(时间戳);
var tod=timestamp.Hour.ToString();
var wd=((int)timestamp.GetWeekDayType()).ToString();
var ssn=((int)seasure.Id).ToString();
返回新列表{clearN,tod,wd,ssn};
}

试试这段代码,尽管我无法完全测试它,因为您没有提供完整的代码。特别是,季节对我来说是没有定义的

对不起,更新了。错放的代码

var inLines = File.ReadAllText(IN_CSV).Split('\n');
var outLines = new List<string>();
outLines.Add(OUT_CSV_HEADER);
foreach (var line in inLines)
{
    if (line.Contains("Time,MW")) continue;
    List<string> ocl = BuildOutCsvLine(line);
    var oclFinal = "";
    ocl.ForEach(o => {
        oclFinal = string.Join(",", oclFinal, o);
    });
    System.Console.WriteLine(oclFinal);
}
    private static List<string> BuildOutCsvLine(string inCsvLine)
    {
        var clearR = inCsvLine.Replace("\r", "");
        var clearN = clearR.Replace("\n", "");
        var inCsvData = clearN.Split(',');
        var timestamp = DateTime.ParseExact(inCsvData[0], "dd/MM/yyyy h:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture);
        var season = seasons.GetSeason(timestamp);
        var tod = timestamp.Hour.ToString();
        var wd = ((int)timestamp.GetWeekDayType()).ToString();
        var ssn = ((int)season.Id).ToString();

        return new List<string> { clearN, tod, wd, ssn };
    }
var inLines=File.ReadAllText(在CSV.Split('\n');
var outLines=新列表();
大纲。添加(OUT_CSV_标题);
foreach(内联线中的var行)
{
如果(行包含(“时间,MW”))继续;
列表ocl=建筑CSVLINE(线);
var oclFinal=“”;
ocl.ForEach(o=>{
oclFinal=string.Join(“,”,oclFinal,o);
});
系统控制台写入线(oclFinal);
}
私有静态列表构建CSVLINE(字符串inCsvLine)
{
var clearR=inCsvLine.Replace(“\r”,”);
var clearN=clearR.Replace(“\n”,”);
var inCsvData=clearN.Split(',');
var timestamp=DateTime.ParseExact(inCsvData[0],“dd/MM/yyyy h:MM:ss tt”,System.Globalization.CultureInfo.InvariantCulture);
var season=seasons.GetSeason(时间戳);
var tod=timestamp.Hour.ToString();
var wd=((int)timestamp.GetWeekDayType()).ToString();
var ssn=((int)seasure.Id).ToString();
返回新列表{clearN,tod,wd,ssn};
}

您应该提及示例输入和预期输出。此输出中存在什么问题以及您预期的结果如果您查看我发布的输出,前四行是列表中项目的顺序,我需要字符串。Join以该顺序连接它们。但是如果你看第五行,输出是置乱的。有帮助吗?你能发几行这样的回复吗?我是说在ocl ForEach(o=>expression?@Vikrant您还应该发布输入文件…您应该提到示例输入和预期输出。此输出中存在什么问题以及您预期的结果如果您查看我发布的输出,前四行是列表中项目的顺序,我希望字符串。Join以该顺序将它们连接起来。但是如果看第五行,输出是置乱的。有帮助吗?你能发布几行o返回吗?我是说在ocl.ForEach中(o=>expression?@Vikrant您也应该发布输入文件…是的,这是预期的,但是如果您查看我发布的输出,
string.Join
正在扰乱顺序!您可以查看string的源代码。您自己加入-.NET不会对其进行扰乱。其中也没有特定于区域性的依赖项。我还尝试了您的或原始代码并获得正确的顺序-我无法生成错误的输出。是的,在不处理行终止时出现问题(\n和\r),由@user1551066指出,奇怪的是这些行终止问题让我问了这个问题!是的,这是预期的,但如果你看我发布的输出,
string.Join
扰乱了顺序!你可以看看string的源代码。你自己加入-.NET不会扰乱它。也没有区域性指定这里有c依赖项。我还尝试了您的原始代码,得到了正确的顺序-我无法生成错误的输出。是的,有一个问题是不考虑行终止(\n和\r),由@user1551066指出,奇怪的是,这些行终止问题让我问这个问题!我尝试了这个问题,但是