在C#中使用foreach循环遍历多个数组

3
这应该是一个简单的问题。我想知道是否有更好的编码方式。我想对每个数组进行foreach循环,而不必重新声明foreach循环。c#是否支持这种方式?我考虑把它放在一个集合中...?
请批评我的代码。
        foreach (TextBox tb in vert)
        {
            if (tb.Text == box.Text)                
                conflicts.Add(tb);                
        }
        foreach (TextBox tb in hort)
        {
            if (tb.Text == box.Text)                
                conflicts.Add(tb);                
        }
        foreach (TextBox tb in cube)
        {
            if (tb.Text == box.Text)
                conflicts.Add(tb);                
        }

你正在使用哪个版本的.NET? - Jason Punyon
一个单独的文本框可以同时存在于两个列表中吗? - SLaks
是的,简而言之,每个数组都是数独程序中的cube、hort和vert文本框的一个textbox[]。因此,为了结构上的需要,我希望每个数组都是独立的,不受其他数组的影响。 - Mike
7个回答

13

你可以使用 LINQ:

conflicts.AddRange(
    vert.Concat(hort).Concat(cube)
        .Where(tb => tb.Text == box.Text)
); 

我假设conflicts是一个有AddRange方法的List<TextBox>列表。如果它不是这样的话,你需要在一个循环中调用Add方法。(single)
如果你正在创建 conflicts(或者它是空的),你可以调用.ToList() 代替。


我将我的“冲突”变量从“TextBox []”更改为“List <TextBox>”。效果很好!感谢所有的回复! - Mike
你也可以写成 conflicts = (...).ToArray() - SLaks
因为每个数组中都有一个相同的文本框实例,所以我只需添加 where 子句(... && tb.Name != box.Name)。 - Mike
1
@Mike:&& tb!= box。你不需要比较“Name”字符串。 - SLaks

3

另一种 .net 3.5 的方法:

conflicts.AddRange(from textBox in vert.Concat(hort).Concat(cube)
                   where textBox.Text == box.Text
                   select textBox);

1

如果由于某种原因你不能使用LINQ(我强烈建议你使用它),那么你可以将数组搜索变为一个单一的方法。例如:

public void FindConflicts(IEnumerable<TextBox> tbList, IList<TextBox> conflicts, string test)
{
   foreach(TextBox tb in tbList)
   {
      if(tb.Text == test)
      {
          conflicts.Add(tb);
      }
   }
}

然后像这样调用它:

FindConflicts(vert, conflicts, box.Text);
FindConflicts(hort, conflicts, box.Text);
FindConflicts(cube, conflicts, box.Text);

1

当然有很多种方法可以编写这个,但你也可以这样做

  foreach (var direction in new[] { vert, hort, cube })
    foreach (TextBox tb in direction)
      if (tb.Text == box.Text)
        conflicts.Add(tb);

0
var unionResult = vert.Concat(hort).Concat(cube)

foreach(TextBox tb in unionResult)
    if(tb.Text == box.Text)
        conflicts.Add(tb);

0
如果您使用的是 .Net 3.5 或更高版本,您应该能够使用 Enumerable.Concat 将它们粘合在一起。
foreach (TextBox tb in vert.Concat(hort).Concat(cube))

"Union" 将删除重复项。 - SLaks
我不想删除重复项,因为每个数组都是由9个文本框组成的集合。如果Union消除了重复项,是否有自然连接函数? - Mike
@Slaks - 谢谢。我知道这一点(并在Enumerable.Concat文档中包含了链接),但是当我输入代码示例时,我的手指没能跟上我的大脑。我已经编辑过它,使用Concat方法代替Union方法。 - 48klocs

-1
如果您想创建数独游戏(在评论中提到),请先了解排列群和组合学。这将帮助您选择更有效的应用程序模型,而无需在文本框上使用foreach。使用惰性计算可以解决对象减少的问题,但不能改善您的逻辑思维。

我很感激你提供的参考资料,但这完全是为了学习目的。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接