2017-05-04 197 views
3

我创建了Settings类,我用它编辑我的应用程序.ini文件。我Settings.ini文件看起来像这样:返回空数组而不是null

[ACCOUNT] 
login=xyz 
password=xyz 
locations=1,2,5,8 

现在我越来越theese值是这样的:

class Settings { 
    public static IniFile Config = new IniFile(Directory.GetCurrentDirectory() + @"\Settings.ini"); 
    public static string Login { get { return Config.Read("login", "ACCOUNT"); } set { Config.Write("login", "ACCOUNT"); } } 
    public static string Password { get { return Config.Read("password", "ACCOUNT"); } set { Config.Write("password", "ACCOUNT"); } } 
    public static int[] Locations { get { return Array.ConvertAll(Config.Read("locations", "ACCOUNT").Split(','), s => int.Parse(s)); } set { Config.Write("locations", "ACCOUNT"); } } 
} 

的问题是,当我Settings.ini文件都有空的位置:

locations= 

我变量Settings.Locations返回null而不是空数组。我试过这样做:

public static int[] Locations 
{ 
    get { return new int[] {Array.ConvertAll(Config.Read("locations", "ACCOUNT").Split(','), s => int.Parse(s))}; } 
    set { Config.Write("locations", "ACCOUNT"); } 
} 

但是,这只是不工作。我不能将int []转换为int。你有什么想法,我怎样才能返回空阵列?

+0

我不明白,'Config.Read( “位置”, “帐户”)'如果没有位置返回null?因为'Locations'属性永远不会返回null,因为'Array.ConvertAll'永远不会返回null。但是,如果'Config.Read'返回null'string.Split'会引发异常。 –

+0

你说得对。现在我注意到我得到'格式异常' –

+0

而不是'Array.ConvertAll',您应该使用循环和'int.TryParse'来尝试解析每个令牌。那么你可以处理无效输入 –

回答

7

可以明确做这样的:

public static int[] Locations 
{ 
    get 
    { 
     string locations = Config.Read("locations", "ACCOUNT"); 
     if (locations == null) 
     { 
      return new int[0]; 
     } 
     return locations 
       .Split(',')   // split the locations separated by a comma 
       .Select(int.Parse) // transform each string into the corresponding integer 
       .ToArray();   // put the resulting sequence (IEnumerable<int>) into an array of integers 
    } 
    set 
    { 
     Config.Write("locations", "ACCOUNT"); 
    } 
} 
+0

我不得不改变为:'if(string.IsNullOrEmpty(works)){'并且它像魅力一样工作。谢谢 :) –

5

首先,你对一行的干扰过多,所以它很难阅读,更不用说排除故障。你需要的是这样的:

public static int[] Locations 
{ 
    get 
    { 
     int[] values = Array.ConvertAll(Config.Read("locations", "ACCOUNT").Split(','), 
      s => int.Parse(s)) ?? new int[] { }; 
     return values; 
    } 
    set 
    { 
     Config.Write("locations", "ACCOUNT"); 
    } 
} 

通知我已经加入到?? new int[] { }首先声明,这就是所谓the null coalescing operator结束。如果其他数组为null,它将返回一个空数组。

这是一个偏好问题,但我将getter分成两行的原因是我可以在返回之前调试和中断以观察返回值。您也可以在最后一个括号中打破,并观察Locals窗口中的返回值。

+0

为什么声明值而根本不使用它?除了丢失';' –

+0

我得到'格式异常',我didint注意到它。你的代码也不起作用。 –