C# 在尝试读取子字符串之前检测文件中的行是否存在

C# detect if line in file exists, before attempting to read substring

我想从文本文件中读取设置。

string MySettingsFile = "Settings.txt";

通常情况下,文件会有 4 行。

SettingA:Alpha1
SettingB:Bravo2
SettingC:Charlie1
SettingD:Delta6

我想在它自己的变量中获取每一行,像这样:

string MyAlpa = "Alpha1";
string MyBravo = "Bravo2";
string MyCharlie = "Charlie1";
string MyDelta = "Delta6";

通常情况下,我会循环读取行,读取每一行并边读边设置字符串。 但是,如果缺少第 4 行,而我正在寻找冒号后的那部分行,那么如果我这样检查它,我会得到一个错误...

MyDelta = MyDeltaSubstring(MyDelta.LastIndexOf(':') + 1);

有没有办法在我尝试获取 SubString 之前 'check for the existence of a specific line'(这样它就不会出错),比如 一个单独的函数,它有 try、catch、finally with return 我想要的字符串或单词 "Missing",如果该行丢失(然后停止,因为没有更多的行)?

function DoesLineExist(int X, string myFile)
{
    string MyString;

    try ()
    {
        // read line X from file myFile
        // get everything AFTER the ":" and put it in MyString
        // ??? //
    }
    catch (ArgumentException null)
    {
        MyString = "Missing";
    }
    catch (ArgumentException e)
    {
        MyString = "Missing";
    }

    finally
    {
        MyString = ? // whatever we got From Line X (after ":")
    }
    return MyString; // only if line is missing
}

有更好的方法吗? ReadAllLines 或其他东西?

这里有几种不同的方法来构建我们稍后将使用的字典或列表对象。选择很简单,是那些键是唯一的,还是您对某些 SettingB 有多个值。如果关系是一对一的 Dictionary could be a solution. Giving you access to method like ContainsKey

var regexDictionary = Regex.Matches(    File.ReadAllText(path)
                                , "(?<key>.+):(?<value>.+)")
                      .OfType<Match>()
                      .Where(m => m.Success)
                      .ToDictionary(m => m.Groups["key"].Value.Trim(),
                                    m => m.Groups["value"].Value.Trim());

var ObjList = File.ReadAllLines(path)
                     .Select(line => line.Split(':'))
                     .Select(x => new MyObject { 
                        prop1 = x[0],
                        prop2 = x[1]
                        // etc 
                      })

var linQDictionary = File.ReadAllLines(path)
                         .Select(line => line.Split(':'))
                         .ToDictionary(
                             c => x[0],
                             c => x[1]
                         );

字典中是否存在该键?

if (!dictionary .ContainsKey("SettingB"))
{
    Console.WriteLine("For key = \"SettingB\", value = {0}.", dictionary["SettingB"]);
}

在对象列表中:

if (ObjList .Any(x=> x.prop1 == "SettingZ" ))
{
    // Select the object. 
}

您需要首先验证该行是否存在,然后再次检查该行是否包含 key/value 对设置是否存在,然后将您的键值对投影到字典中,然后将每个设置获取到你的变量的键名。

这里我创建了一个控制台应用程序供您演示。

class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, string> dictSettings = new Dictionary<string, string>();

        string MyAlpa = "";
        string MyBravo = "";
        string MyCharlie = "";
        string MyDelta = "";

        var lines = File.ReadAllLines(@"C:\Users\xxx\source\repos\ConsoleApp4\ConsoleApp4\Files\Sample.txt");
        for (var i = 0; i < lines.Length; i += 1)
        {
            var line = lines[i];
            //DoesLineExist(line);

            if (!string.IsNullOrEmpty(line) && line.Contains(":"))
            {
                string settingKey = line.Split(':')[0];
                string settingValue = line.Split(':')[1];
                dictSettings.Add(settingKey, settingValue);
            }
        }


        MyAlpa = dictSettings.ContainsKey("SettingA") ? dictSettings["SettingA"] : "";
        MyBravo = dictSettings.ContainsKey("SettingB") ? dictSettings["SettingB"] : "";
        MyCharlie = dictSettings.ContainsKey("SettingC") ? dictSettings["SettingC"] : "";
        MyDelta = dictSettings.ContainsKey("SettingD") ? dictSettings["SettingD"] : "";

        Console.WriteLine(MyAlpa);
        Console.WriteLine(MyBravo);
        Console.WriteLine(MyCharlie);
        Console.WriteLine(MyDelta);

        Console.ReadLine();
    }

    //private static void DoesLineExist(string line)
    //{
    //    if (!string.IsNullOrEmpty(line) && line.Contains(":"))
    //    {
    //        string settingKey = line.Split(':')[0];
    //        string settingValue = line.Split(':')[1];
    //        dictSettings.Add(settingKey, settingValue);
    //    }
    //}
}

输入:

SettingA:Alpha1
SettingB:Bravo2
SettingC:Charlie1

输出:

输入:

SettingA:Alpha1
SettingC:Charlie1
SettingD:

输出: