C# 来自多个数组的foreach循环#

C# 来自多个数组的foreach循环#,c#,arrays,foreach,C#,Arrays,Foreach,这应该是一个简单的问题。我只想知道是否有更好的编码方法。我想为每个数组执行foreach循环,而不必重新声明foreach循环。c#有没有办法预测这一点?我想把这个收藏起来 请评论我的代码 foreach (TextBox tb in vert) { if (tb.Text == box.Text) conflicts.Add(tb);

这应该是一个简单的问题。我只想知道是否有更好的编码方法。我想为每个数组执行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);                
        }
您可以使用LINQ:

conflicts.AddRange(
    vert.Concat(hort).Concat(cube)
        .Where(tb => tb.Text == box.Text)
); 
我假设
冲突
是一个
列表
,它有一个
AddRange
方法。如果不是,则需要在(单个)循环中调用
Add

如果您正在创建
冲突
,(或者如果它开始为空),您可以调用
.ToList()

如果您使用的是.Net 3.5或更高版本,您应该能够调用

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

foreach(TextBox tb in unionResult)
    if(tb.Text == box.Text)
        conflicts.Add(tb);
foreach (TextBox tb in vert.Concat(hort).Concat(cube))

另一种.net 3.5方法:-

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

如果出于任何原因(我强烈建议您这样做)不能使用LINQ,那么您可以使用单个方法搜索数组。例如:

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

当然有很多方法可以写这篇文章,但你也可以这样做

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

若你们试图创建数独游戏(在评论中提到),首先阅读排列群和组合数学。
这将帮助您在文本框上使用foreach选择更高效的应用程序模型w/o。使用惰性计算可以解决对象缩减问题,但不能提高逻辑能力。

您使用的.NET版本是什么?一个文本框可以在两个列表中吗?是的,简而言之,每个数组都是数独程序的cube、hort和vert文本框的文本框[]。因此,出于结构化目的,我希望每个数组独立于其他数组。
Union
将删除重复项。我不希望删除重复项,因为每个数组是9个文本框的集合。如果Union消除了DUP,是否有一个自然连接函数?@Slaks-谢谢。我知道这一点(并包含了一个指向Enumerable.Concat文档的链接),但当我键入代码示例时,我的手指无法与大脑配合。我将其编辑为使用Concat方法而不是Union。我将冲突变量从TextBox[]更改为List。很好!感谢所有的回复!您还可以编写
冲突=(…).ToArray()
。因为每个数组中都有一个相同文本框的实例,所以我只需添加where子句(…&&tb.Name!=box.Name)–@Mike:`&&tb!=框
。您不需要比较
Name`字符串。我很感谢您的参考,但这完全是为了学习。
  foreach (var direction in new[] { vert, hort, cube })
    foreach (TextBox tb in direction)
      if (tb.Text == box.Text)
        conflicts.Add(tb);