0

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

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 之前“检查是否存在特定行”(所以它不会出错),比如在一个单独的函数中,它有 try,catch,最后返回字符串我想要或“丢失”这个词,如果该行丢失(然后因为没有更多的行而停止)?

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 还是什么?

4

2 回答 2

2

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

在这里,我为您的演示目的创建了一个控制台应用程序。

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:

输出:

在此处输入图像描述

于 2018-10-13T07:49:33.750 回答
0

这是构建我们稍后将使用的字典或列表对象的几种不同方法。选择很简单,是那些键是唯一的,还是您对某些键有多个值SettingB。如果关系是一对一的,那么字典可能是一个解决方案。让您可以访问类似的方法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. 
}
于 2018-10-13T07:16:31.503 回答