【问题标题】:Split string issues with null position使用空位置拆分字符串问题
【发布时间】:2014-07-18 17:04:43
【问题描述】:

我有一串星期几。我在 C# 中解析它并将每天存储在一个单独的变量中。例如:

string weekdayName = "Mon,Tue,Wed,Thu,Fri,Sat,Sun";

我使用“,”作为分隔符将它们分开:

var weekDayName = weekDay.Split(',');
var firstDay = weekDayName[0];
var secondDay = weekDayName[1];
var thirdDay = weekDayName[2];
var fourthDay = weekDayName[3];
var fifthDay =  weekDayName[4];
var sixDay = weekDayName[5];
var seventhDay = weekDayName[6];

一切正常。但是,字符串会动态变化。用户指定星期几。例如,字符串 weekDayName 只能包含“Mon,Tue”。但我遇到的问题是,如果不是所有位置都包含值,它将失败。

索引超出了数组的范围。

我试过了:

if (weekDayName[5].Length >0)
{
    var sixDay = weekDayName[5];
}

但还是失败了……

如何检查并获取现有数据的值,如果缺少某些位置我就忽略它们?

我想要实现的是:

DateTime currentDay = new DateTime();
currentDay = DateTime.Now;

if (currentDay.ToString("ddd") == firstDay || currentDay.ToString("ddd") == seconday)
{
    // I will check the currentDay against every day of the week
    //do something
}

【问题讨论】:

  • 这个检查if (weekDayName[5].Length >0) 应该是if (weekDayName.Length > 0)。目前您正在尝试检查字符串的长度,而不是数组的长度。但是一定有更好的方法来处理,为什么不使用DayOfWeek枚举
  • 我很好奇你为什么在 DateTime 为你提供这些数据时试图解析它:)
  • Pheonixblade9,我实际上是从注册表中获取该字符串。
  • “我实际上是从注册表中获取该字符串”上帝与你同在。
  • 那么你对firstDaysecondDaythirdDay、...做了什么?为什么你不能有一个你使用的string[] days

标签: c# arrays string split


【解决方案1】:

您的索引超出范围并非来自您认为的位置。我当然假设了这一点,因为如果用户输入 Mon,Tue,您尝试检查从未设置过的元素的长度。

var enteredDays = weekDay.Split(',');
for(var i = 0; i < enteredDays.Length; i++)
{
    var day = enteredDays[i];
    if(i == 0)
       first = day;
    else if(i == 1)
       second = day;

    ... etc....
}

现在您可以在需要使用从数组中提取的值时检查String.IsNullOrEmpty(..yourDay..)。你不能对它们使用.Length,因为它们是null,除非你将它们全部默认为string.Empty,否则它们会爆炸。

【讨论】:

    【解决方案2】:

    必须有一些更聪明的方法来做到这一点,但由于我不知道字符串的来源,我很难做出更好的解决方案。

    但是,鉴于当前的要求,您可以执行以下操作:

    string weekdayName = "Mon,Tue,Wed,Thu,Fri,Sat,Sun";
    
    List<String> weekDaysList = weekdayName.Split(',').ToList();
    
    foreach (var weekDay in weekDaysList.Take(2))
    {
           if (weekDay == DateTime.Now.ToString("ddd"))
           {
                  // do something
                  break;
           }
    
     }
    

    【讨论】:

      【解决方案3】:

      如果您愿意尝试 Linq(这是 C# 3.5 及更高版本的语言功能,只需包含 System.Linq namespace),您可以这样做:

      string[] names = weekdayName
          .Split(',')
          .Select(s => s.Trim())
          .Where(s => s.Length > 0)
          .ToArray();
      

      names 数组现在包含所有非空日期名称,没有任何前导或尾随空格。

      【讨论】:

        【解决方案4】:

        哇,这是用于简单检查的大量代码,正如其他成员所提到的,您可以使用 LINQ 将所有验证合并到单个查询中,例如:

        string weekdayName = "Mon,Tue,Wed,Thu,Fri,Sat,Sun";
        var wc = weekdayName.Split(',');
        
        if (wc.Any(str => str.Contains(DateTime.Today.DayOfWeek.ToString().Substring(0,3))))
        {
        
        }
        

        试试这个,如果您有任何疑虑,请告诉我。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-08-19
          • 1970-01-01
          • 1970-01-01
          • 2020-05-24
          • 2015-01-08
          • 2021-10-23
          • 1970-01-01
          相关资源
          最近更新 更多