2

私はlinqが初めてです。次の形式の文字列があります

code:description;code2:description2;code3:description3... etc.

レコードは;文字で区切られ、各レコードには文字で区切られた 2 つのフィールドがあり:ます。

コードと説明をフィールドとして持つオブジェクトのリストを抽出する linq クエリを作成しています。正しい結果が得られるように見える次のクエリを作成しましたが、それを行うためのより良い方法またはより正しい方法があるかどうか疑問に思っていました。

var objects =
    from objString in recsString.Split(';')
    let obj = objString.Split(':')
    select new {
        Code = obj[0].Trim(),
        Description = obj[1].Trim()
    };
4

2 に答える 2

6

それは完全に問題ありませんが、私が行う唯一の観察は、次を使用して空のエントリを削除することですStringSplitOptions:

var objects =
from objString in recsString.Split(';', StringSplitOptions.RemoveEmptyEntries)
let obj = objString.Split(':', StringSplitOptions.RemoveEmptyEntries)
select new {
    Code = obj[0].Trim(),
    Description = obj[1].Trim()
};

情報が不足している可能性があると思われる場合は、さらに安全null確保して結果を確認することもできます。

var objects =
from objString in recsString.Split(';', StringSplitOptions.RemoveEmptyEntries)
let obj = objString.Split(':', StringSplitOptions.RemoveEmptyEntries)
select new {
    Code = obj.Any() ? obj[0].Trim() : string.Empty,
    Description = obj.Count > 1 ? obj[1].Trim() : string.Empty
};
于 2013-05-22T14:24:12.457 に答える
3

あなたがしていることは問題ありません。ラムダを使用して記述する方法は次のとおりです。

string objString = "code:description;code2:description2;code3:description3";

Dictionary<string, string> results =
    objString.Split(';')
             .Select(x => x.Split(':'))
             .ToDictionary(key => key[0], value => value[1]);

// And now you have a nice little dictionary
foreach (var r in results)
    Console.WriteLine("{0}:{1}",r.Key, r.Value);

またはもちろん:

    var results = objString.Split(';')
                           .Select(x => x.Split(':'))
                           .Select(x => new {Code = x[0], Description = x[1]});

    foreach (var r in results)
        Console.WriteLine("{0}:{1}",r.Code, r.Description);
于 2013-05-22T14:28:30.030 に答える