2017-01-04 2 views
3

現在、私は同じ操作を各自で実行する必要がある2つの異なるリストを持っています。同じループを実行して2つの異なるコレクションを作成する方が良い#c#

foreach (FileMatch fileName in lstChanged.Items) 
{ 
    List<Symbol> fileOneSymbols = new List<Symbol>(); 
    List<Symbol> fileTwoSymbols = new List<Symbol>(); 
    foreach (List<Symbol> list in new[] { fileOneSymbols, fileTwoSymbols }) 
    { 
     string[] lines = File.ReadAllLines(list == fileOneSymbols ? _folderOne : _folderTwo + fileName.FilePath); 
     for (int i = 0; i < lines.Length; i++) 
     { 
      string line = lines[i]; 
      if (line.Contains("inst")) 
      { 
       list.Add(new Symbol(line, lines[i + 1], i + 1)); 
      } 
     } 
    } 
    //Further Processing to go here 
} 

それは重要な問題ではないのですが、私は二度同じ(ISH)のコードを書いて好きではないと私は私ができる知っている:

は私の現在の方法よりも、それを行うには良い方法はありますそれを関数として取り出し、それを2回コールしますが、これを行うコードの方がコードの臭いが少ない方がいいかと思います。

+2

2番目のループ内で何をしたいか –

+1

2番目のforeach用に別の関数を作成します –

+4

'listOne.Concat(listTwo)'? –

答えて

1

あなたは別々の方法で抽出する必要がありますし、このようなあなたのループ内でそれを呼び出す

private IEnumerable<Symbol> _getSymbolsFromFile(string fileName) 
{  
     string[] lines = File.ReadAllLines(fileName); 
     for (int i = 0; i < lines.Length; i++) 
     { 
      string line = lines[i]; 
      if (line.Contains("inst")) 
       yield return new Symbol(line, lines[i + 1], i + 1); 
     } 
} 

を:

List<Symbol> fileOneSymbols = _getSymbolsFromFile(_folderOne + fileName.FilePath).ToList(); 
List<Symbol> fileTwoSymbols = _getSymbolsFromFile(_folderTwo + fileName.FilePath).ToList(); 
0
var list1= new List<string>(); 
    // manipulate list1 
var list2= new List<string>(); 
    // manipulate list2 
var MainList= new List<string>(); 
MainList.AddRange(list1); 
MainList.AddRange(list2); 
MainList.ForEach(t=>{ 
    // do your action 
}); 
+0

*なぜ*リストをコピーしますか?とにかく、あなたはその質問がループを指しているが実際にリストをループしていないことに気付くだろう。それは内部アクション –

+0

の中にそれらを埋め込むので、他のリストにリストを追加してループを実行することができます –

0

あなたはリストをループ言及、まだあなたのコードは行いません。それ。実際、リストは、開始時には空であり、リストが処理されていることに基づいて内側のループ自体で埋められます。

フォルダー、ファイルを処理し、結果を一覧表示して、コードlotを簡略化することができます。

フォルダを入力として受け取り、シンボルのリストを返す単純なメソッドを作成できます。あなたはデータを見たい場合:

IEnumerable<Symbol> SymbolsFromFolder(string file) 
{ 
    string[] lines = File.ReadAllLines(file); 
    for (int i = 0; i < lines.Length-1; i++) 
    { 
     string line = lines[i]; 
     if (line.Contains("inst")) 
     { 
      yield return new Symbol(line, lines[i + 1], i + 1); 
     } 
    } 
} 

完全なコードはなることができます:

foreach (FileMatch fileName in lstChanged.Items) 
{ 
    var symbolsOne= SymbolsFromFolder(Path.Combine(_folderOne, fileName.FilePath); 
    var symbolsTwo= SymbolsFromFolder(Path.Combine(_folderTwo, fileName.FilePath); 
//Further Processing to go here 
} 

使用すると、1つとして、すべてのシンボルを踏むしたい場合は、単一のリストですべてを返すことができます:

var folders=new[]{_folderOne,folderTwo} 
var allSymbols=from FileMatch fileName in lstChanged.Items 
       from folder in folders 
       let symbols=SymbolsFromFolder(Path.Combine(_folderOne, fileName.FilePath) 
       from symbol in symbols 
       select symbol; 
関連する問題