文字列をオブジェクトに変換したい。文字列は以下の構文にあります。
string nameIdPair = "name1:123\r\nname2:456\r\n";
これを変換したいオブジェクトが以下のように定義されているとします。
public struct MyStruct
{
public string Name;
public int Id;
}
私は以下のクエリを思いついた
var elements = nameIdPair.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries)
.Where(p => !string.IsNullOrWhiteSpace(p))
.Select(r => r.Split(':'))
.Select(s => ReturnObject(s));
また、私はSQLタイプのlinqクエリを書くことを好むので、上記のクエリを分割して、以下の解決策を考え出しました
var elements = from p in nameIdPair.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries)
where !string.IsNullOrWhiteSpace(p)
select ReturnObject(p); // Here p is string not string[]
ヘルパー関数を呼び出したくありませんでした:-
string[] tempContainer = new string[] { };
var elements = from p in nameIdPair.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries)
where (tempContainer = p.Split(':')) != null
select new { name = tempContainer[0], id = tempContainer[1] };
private static object ReturnObject(string inputString)
{
string[] value = inputString.Split(':');
myObject.Name = value[0];
myObject.Id = int.Parse(value[1]);
return myObject;
}
最後のクエリでは、dummyContainer を使用して Where() を呼び出すだけで、dummyContainer をロードしていることに注意してください。ダミー変数や外部関数呼び出しを使用せずに最後のクエリを書き直したかったのですが、実行可能な解決策を思いつくことができませんでした。
私は以下のようなものを書くことができます
var elements = from p in nameIdPair.Split(new string[] { "\r\n", "\n" },StringSplitOptions.RemoveEmptyEntries)
select new { name = p.Split(':')[0], id = p.Split(':')[1] };
しかし、ここでは、同じ文字列に対して何度も分割操作を行っています。一時変数を使用せずに、これを回避するにはどうすればよいですか。(from p in elements)
また、呼び出されるのではなく、これらのスタイルのLINQクエリ(名前)がどのように呼び出されるかを忘れましたelements.Select()
。
ReturnObject
また、関数を呼び出さずに、この投稿の最初のクエリを書き直す方法を知りたい
です
さらに調べて見つけたlet
var items = from p in nameIdPair.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries)
let r = p.Split(':')
select new { name = r[0], id = r[1] };
ありがとう :)