C# 来自多个数组的foreach循环#
这应该是一个简单的问题。我只想知道是否有更好的编码方法。我想为每个数组执行foreach循环,而不必重新声明foreach循环。c#有没有办法预测这一点?我想把这个收藏起来 请评论我的代码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 (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);