执行相同循环以填充两个不同集合的更好方法c#

时间:2017-01-04 14:02:26

标签: 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)代码,我知道我可以把它作为一个函数拉出来并调用两次,但我只是想知道是否有更好的,更少的代码味道这样做。

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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
 });

答案 2 :(得分: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
}

如果您想将所有符号都作为一个符号,您可以将所有符号都返回到一个列表中:

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;