在 foreach 循环中切换语句 - 没有得到预期的结果

Posted

技术标签:

【中文标题】在 foreach 循环中切换语句 - 没有得到预期的结果【英文标题】:Switch statement inside a foreach loop - not getting expected results 【发布时间】:2013-09-11 18:26:05 【问题描述】:

所以我试图循环浏览我的应用程序列表框中的项目。列表框将允许您选择多个项目,我有一个方法与列表框中的每个项目相关联。每次循环工作时,我都会增加一个计数器变量。当我将 foreach 循环与下面的 switch 语句一起使用时,它会正确执行第一项,但随后会再次循环通过同一项。我知道我遗漏了一些东西,因为它应该转到列表框中的下一个项目,而不是同一个项目。

      string reportname = lstbxReports.SelectedValue.ToString();
      int i = 0;
            foreach (var report in reportname)
            
                switch (reportname)
                
                    case "Overview":
                        
                            if (i < 1)
                            
                                PrintOverview(filename);
                            
                            else if (i >= 1)
                            
                                PrintOverviewAppend(filename);
                            
                            break;
                        
                    case "Sources":
                        
                            if (i < 1)
                            
                             PrintSource(filename);
                            
                            else if (i >= 1) 
                            
                             PrintSourceAppend(filename);
                            
                            break;
                        
                       
                      i++

关于如何让 foreach 循环转到所选列表框中的下一项的任何想法或建议?

另外,这只是一个 sn-p,因为我有大约 11 个案例项目要循环。

【问题讨论】:

switch (reportname)? foreach (var report in reportname)?对吗? 当您将鼠标悬停在foreach 中的var 上时,您会看到reportcharreportname 是一个字符串,并且迭代字符串会给您一个集合字符) - 我假设这不是你想要做的。只是需要注意一些事情,确保您在 foreach 处理某事时迭代正确的集合。 如果您要拥有一组固定的“报告名称”,那么我建议您使用 Enum。更不容易出错,更易读,更容易switch on。 【参考方案1】:

您可能想要打开report,而不是reportname

【讨论】:

可能是foreach (var reportname in report) 这可能更有意义。 Reportname 是保存列表框中所选项目的字符串。如果我试图改变它,它对我来说是行不通的。哈【参考方案2】:
foreach(string item in listBox.Items)


?

取决于您如何设置列表框的数据源(我假设这是 WinForm?)。如果您通过添加 .Items 或使用设计器创建它,那么这将起作用。但是,如果您使用过 .DataSource ,那么它将无法正常工作。

我个人有一个

List<string> list = SomeMethodWhereIMakeTheList(); 

并将其设置为:

listbox.DataSource = list;

那么我什至不必触摸 ListBox 来弄乱内容:

list.ForEach(...)

【讨论】:

啊.. 是的,这就是我要做的。谢谢!【参考方案3】:

不要在 foreach 中执行打印逻辑。拆分数据然后打印这样的(注意我将 reportname 的名称更改为 reportnames 以表示项目列表

string reportnames = lstbxReports.SelectedValue.ToString();

var firstReport = reportnames.First(); // No error checking here, would use FirstOrDefault with null checks.

if (firstReport == "OverView")
   PrintOverview(filename);
else
   PrintSource(filename);

// Now print out the rest
reportnames.Skip(1)
           .ToList()
           .ForEach(rp =>

   if (rp == "OverView")
      PrintOverviewAppend(filename);
   else
      PrintSourceAppend(filename);
);

【讨论】:

以上是关于在 foreach 循环中切换语句 - 没有得到预期的结果的主要内容,如果未能解决你的问题,请参考以下文章

在foreach循环中声明时的SQLDataReader对象

C#中foreach语句的作用?

请解答下这个foreach语句啥意思

求助:foreach如何控制循环次数

foreach遍历循环数组

在C#中for循环和foreach循环有啥区别?