web-dev-qa-db-ja.com

C#で区切られた文字列を辞書<string、string>に変換します

「key1 = value1; key2 = value2; key3 = value3;」という形式の文字列があります

上記のキーと値のペアの辞書に変換する必要があります。

これについて最善の方法は何でしょうか?ありがとう。

34
S G

このようなもの?

var dict = text.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries)
               .Select(part => part.Split('='))
               .ToDictionary(split => split[0], split => split[1]);

もちろん、仮定が満たされない場合、これは失敗します。たとえば、テキストが正しい形式でない場合はIndexOutOfRangeExceptionがスローされ、重複キーがある場合はArgumentExceptionがスローされます。これらのシナリオにはそれぞれ異なる修正が必要です。余分な空白が存在する可能性がある場合は、string.Trim必要に応じて呼び出します。

82
Ani

最後にセミコロンを考慮するようにアニを更新しました。 where句は、作成と入力の前にキーと値があることを確認します。

var dictionary = "key1=value1;key2=value2;key3=value3;"
    .Split(';')
    .Select (part  => part.Split('='))
    .Where (part => part.Length == 2)
    .ToDictionary (sp => sp[0], sp => sp[1]);
17
Bivoauc

たとえば、JSON文字列を使用してこれを行うことができます。

var dic = JsonConvert.DeserializeObject<Dictionary<int, string>>("{'1':'One','2':'Two','3':'Three'}");
9
Gerardo Garcia

無視する素晴らしい空白を見て、最後の値を正規表現のセミコロンの力を持っていても持っていなくても修正してください:

        var dict = Regex.Matches("key1 = value1; key2 = value2 ; key3 = value3", @"\s*(.*?)\s*=\s*(.*?)\s*(;|$)")
        .OfType<Match>()
        .ToDictionary(m => m.Groups[1].Value, m => m.Groups[2].Value);

しかし、真剣に、Aniは.ToDictionary()の小道具に値します。私はそのことを考えたことがなかったでしょう。

9
Kevin Stricker

このように書くか、ループして自分でやることができます。どちらにしても。最終的には、;でアイテムのペアを取得し、=キーと値を取得します。

string input = "key1=value1;key2=value2;key3=value3;";
Dictionary<string, string> dictionary =
    input.TrimEnd(';').Split(';').ToDictionary(item => item.Split('=')[0], item => item.Split('=')[1]);

ループバージョン:

Dictionary<string, string> dictionary = new Dictionary<string, string>();
string[] items = input.TrimEnd(';').Split(';');
foreach (string item in items)
{
    string[] keyValue = item.Split('=');
    dictionary.Add(keyValue[0], keyValue[1]);
}
6
Anthony Pegram