【问题标题】:print one line from foreach in c#在c#中从foreach打印一行
【发布时间】:2014-09-24 14:24:36
【问题描述】:

我正在尝试打印符号 (trimmedLine) 和列表中的值 (matchedSymbols),但它会打印每个符号的所有有效符号的所有值。我尝试不使用 foreach 循环,但随后它会打印搜索到的最后一个符号的值,这是无效的。以下是我当前的方法代码:

public void searchSymbolTable()
    {
        string searchingForFile = "";
        string[] searchFile;

        Console.Write("Enter the name of the search file: ");
        searchingForFile = @"../../" + Console.ReadLine();
        Console.WriteLine("Searching symbol table...");
        Console.WriteLine();

        while (!File.Exists(searchingForFile))
        {
            Console.Write("File not found, try again or enter 1 to exit: ");
            searchingForFile = @"../../" + Console.ReadLine();
            if (searchingForFile == @"../../1")
            {
                Environment.Exit(1);
            }
        }

        searchFile = File.ReadAllLines(searchingForFile);


        matchedSymbols = new List<symbols>();
        var space = ' ';

        foreach (string line in searchFile)
        {
            try
            {
                var trimmedLine = line.Trim();
                var tokens = trimmedLine.Split(space);

                trimmedLine = checkSymbol(tokens[0]);

                matchedSymbols.Add(mySymbols.ToList().Find(symName => symName.ToString() == trimmedLine));


                if (matchedSymbols[matchedSymbols.Count() - 1] == null)
                {
                    throw new Exception(string.Format("ERROR - Symbol {0} not found in symbol table.", trimmedLine));
                }
                else
                {
                   foreach(symbols s in mySymbols)
                   {

                           Console.WriteLine(string.Format("{0,-10} {1}", trimmedLine, s.value));

                   }

                }
            }
            catch (Exception e)
            {

                Console.WriteLine(e.Message);
                if (Console.CursorTop % 20 == 19)
                {
                    Console.Write("Press any key to continue ...");
                    Console.ReadKey();
                }

            }
        }
    }

【问题讨论】:

  • 我认为你的内部 foreach 应该迭代 matchedSymbols 而不是 mySymbols - 对吗?另外,您是否希望trimmedLine 匹配mySybols 中的多个符号?
  • 将其更改为matchedSymbols 并不能解决问题,尽管我更改了它,因为应该使用它是有道理的。它仍然打印出它查看的最后一个值。每个符号和值的打印次数似乎与其在列表中的位置相关(即第一个符号打印一次,第二个符号打印两次)。至于 trimmedLine,它会找到一个符号的匹配项,因为我不允许重复。
  • 您目前的输出究竟是什么,您期望它是什么?
  • 现在我得到(在列中):N 98,a123 98,A123 98......它应该是 N 5,a123 -45,A123 -55。 98 来自我的符号表文件中最后一个符号的值。
  • 那么 98 是“mySymbols”中的最后一个符号?还是我误会了?

标签: c# printing symbols


【解决方案1】:

由于您只寻找一个匹配项,因此您不需要内部 foreach...

我已经用一些 Linq 替换了您的 Find,它将选择第一个匹配项(或返回 null)

var trimmedLine = line.Trim();
var tokens = trimmedLine.Split(space);

trimmedLine = checkSymbol(tokens[0]);

//look for the match, select the first (null if no matches)
var matchedSymbol = mySymbols.FirstOrDefault(symName => symName.ToString() == trimmedLine);

//if null (no match)                
if (matchedSymbol == null)
{
    throw new Exception(string.Format("ERROR - Symbol {0} not found in symbol table.", trimmedLine));
}
else
{
    //print the match
    Console.WriteLine(string.Format("{0,-10} {1}", trimmedLine, matchedSymbol.value));
    //add the match to your collection of matches
    matchedSymbols.Add(matchedSybol);
}

【讨论】:

  • 在符号表中搜索匹配项工作正常。但是,当我尝试将符号的值附加到找到的符号时,我遇到了问题。这就是每个循环内部的用途,除非我没有得到正确的值。
猜你喜欢
  • 1970-01-01
  • 2021-06-11
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 2014-03-19
相关资源
最近更新 更多