2017-01-31 4 views
1

linqからtxtファイルにいくつかの問題があります。 txtファイルは、次の特定の構造を有する:C#ラムダからtxtファイル

================ 09.01.2017 [8:51:11] created by VBScript ================ 

    ....some text 

============================= END ============================= 

================ 16.01.2017 [9:49:09] created by VBScript ================ 

    ....some text 

============================= END ============================= 

================ 18.01.2017 [8:43:50] created by VBScript ================ 

    ....some text 

============================= END ============================= 

etc 

だから私は始まり、「=」で終わるし、その中にそのインデックス(位置)を選択し、そのファイルからすべての行を選択します。

まずステップ:私は開かれ、リストにconverteredました(それはリストで動作するように簡単です原因)

string filekvitErrorGroupsResource = Utils.ReadTextResource(resourceName, Assembly.GetExecutingAssembly()); 
string[] stringSeparators = {"\r\n"}; 
string[] lines = filekvitErrorGroupsResource.Split(stringSeparators, StringSplitOptions.None); 
return new List<string>(lines); 

第二ステップ:私は条件により一覧表示するには、簡単なラムダクエリを作成しようとしました:

var myQuery = lines.Where(l => l.StartsWith("=") && l.EndsWith("=")) 
        .Select(l => new {idx = lines.IndexOf(l), body = l}); 

問題:その結果、私はユニークなインデックス(IDX)と文字列のリストを受け取ることを期待、代わりに私は、この受信しました:

lambda_problem

「END」の行が一意ではないことがわかりますが、なぜですか?

+0

Distinct()はどこですか? – Hakunamatata

+1

Distinct()はここでは役に立ちません。(idx = 8)行のすべてのirepeatsを削除します – whizzzkey

+0

毎回同じ文字列であるため一意ではありません。 Index ofは、文字列の最初の出現を検出します。 https://msdn.microsoft.com/en-us/library/5xkyx09y(v=vs.110).aspx – briantyler

答えて

4

a.IndexOf(b)は、最初に出現したbのインデックスをaに返します。したがって、=== END ===のインデックスは常に同じです。

代わりにan overload of Selectを使用して、Func<TSource, int, TResult>をパラメータとして使用して、要素のインデックスを取得できます。

var myQuery = lines 
    .Select((l, i) => new {idx = i, body = l}) 
    .Where(l => l.body.StartsWith("=") && l.body.EndsWith("=")); 
+0

さて、それは動作します! – whizzzkey

0

END行のすべてが同じ文字列であるため、lines.IndexOf(..)を呼び出すと、最初に一致するインスタンスが返されるという問題があります。

その後、NextIndexOfを呼び出すと、前回終了した場所からの検索が開始されます。

+0

ok私はあなたの応答の点を得ます – whizzzkey

1

あなたはどこやって、その後の選択最初とを使用して別のインデックスを持つことができ

var myQuery = lines.Select((l,idx) => new {idx = idx, body = l}).Where(m => m.body.StartsWith("=") && m.body.EndsWith("=")); 

ここシオマネキです。https://dotnetfiddle.net/JW7S1s

編集:コメントごとに更新回答

+0

thx、私はそれを試してみます – whizzzkey

+1

選択は、ラムダの第2引数として整数を提供するオーバーロードがあります。 'index ++'ビット 'lines.Select((l、ix)=> new {idx = ix、body = l})で自分自身をロールバックしないでください。(m => ...)' – pinkfloydx33

+0

@ pinkfloydx33 Nice one ! – Hakunamatata

関連する問題