目前我有两个不同的列表,需要对每个列表执行相同的操作。
有没有比现有方法更好的方法:
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)代码,我知道我可以把它作为一个函数拉出来并调用两次,但我只是想知道是否有更好的,更少的代码味道这样做。
答案 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;