Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行相同循环以填充两个不同集合的更好方法c#_C# - Fatal编程技术网

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

执行相同循环以填充两个不同集合的更好方法c#,c#,C#,目前,我有两个不同的列表,需要对每个列表执行相同的操作 有没有比我目前的方法更好的方法: foreach (FileMatch fileName in lstChanged.Items) { List<Symbol> fileOneSymbols = new List<Symbol>(); List<Symbol> fileTwoSymbols = new List<Symbol>(); foreach (List<S

目前,我有两个不同的列表,需要对每个列表执行相同的操作

有没有比我目前的方法更好的方法:

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
}
foreach(lstChanged.Items中的文件名匹配)
{
List fileOneSymbols=新列表();
List fileTwoSymbols=新列表();
foreach(以新[]{fileOneSymbols,fileTwoSymbols}的形式列出列表)
{
string[]line=File.ReadAllLines(list==fileOneSymbols?\u folderOne:\u folderTwo+fileName.FilePath);
对于(int i=0;i
这不是一个关键问题,我只是不喜欢编写两次相同的(ish)代码,我知道我可以将其作为函数提取并调用两次,但我只是想知道是否有更好的、更少代码气味的方法来实现这一点。

var list1=new List();
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
 });
//操纵列表1 var list2=新列表(); //操纵列表2 var MainList=新列表(); MainList.AddRange(列表1); MainList.AddRange(列表2); MainList.ForEach(t=>{ //行动起来 });
您应该提取一个单独的方法:

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);
      }
}
private IEnumerable\u getSymbolsFromFile(字符串文件名)
{      
string[]lines=File.ReadAllLines(文件名);
对于(int i=0;i
然后在循环中调用它,如下所示:

List<Symbol> fileOneSymbols = _getSymbolsFromFile(_folderOne + fileName.FilePath).ToList();
List<Symbol> fileTwoSymbols = _getSymbolsFromFile(_folderTwo + fileName.FilePath).ToList();
List fileOneSymbols=_getSymbolsFromFile(_folderOne+fileName.FilePath).ToList();
List fileTwoSymbols=_GetSymbolFromFile(_folderTwo+fileName.FilePath).ToList();

您提到在列表上循环,但您的代码没有这样做。事实上,列表在开始时是空的,由内部循环本身填充,根据该列表进行处理。如果按逻辑方式移动,您可以大大简化代码:

处理文件夹、文件、筛选行并创建结果列表

您可以创建一个简单的方法来接收文件夹作为输入并返回符号列表。如果要查看数据,请执行以下操作:

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);
        }
    }
}
如果要将所有符号作为一个符号处理,可以在单个列表中返回所有符号:

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;

在第二个循环中要做什么为第二个foreach
listOne.Concat(listwo)
创建一个单独的函数?只需将两个列表连接起来即可。@jameshough您的编辑不再有意义了。您没有迭代列表内容,而是修改它们。您不需要本地函数。您需要进行剧烈的重构。颠倒评估顺序。创建结果,然后将它们收集到一个列表或任何你想要的东西中为什么要复制这些列表?无论如何,你会注意到这个问题提到了循环,但实际上并没有在列表上循环。它在内部action中填充它们,所以您可以将列表中的一个添加到另一个,然后在其上运行循环
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;