[英]foreach loop from multiple arrays c#
這應該是一個簡單的問題。 我想知道的是,是否有更好的編碼方式。 我想為每個數組做一個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)
);
我假設conflicts
是List<TextBox>
,它有一個AddRange
方法。 如果不是,則需要在(單個)循環中調用Add
。
如果您正在創建conflicts
(或者如果它開始為空),則可以調用.ToList()
。
另一種.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);
}
}
}
然后像這樣調用它:
FindConflicts(vert, conflicts, box.Text);
FindConflicts(hort, conflicts, box.Text);
FindConflicts(cube, conflicts, box.Text);
var unionResult = vert.Concat(hort).Concat(cube)
foreach(TextBox tb in unionResult)
if(tb.Text == box.Text)
conflicts.Add(tb);
如果您使用.Net 3.5或更高版本,您應該能夠使用Enumerable.Concat將它們粘合在一起 。
foreach (TextBox tb in vert.Concat(hort).Concat(cube))
當然有很多方法可以寫這個,但你也可以這樣做
foreach (var direction in new[] { vert, hort, cube })
foreach (TextBox tb in direction)
if (tb.Text == box.Text)
conflicts.Add(tb);
如果您嘗試創建Sudoku游戲(在評論中提到),請先閱讀有關Permutation組和Combinatorics的內容。 這將幫助您在文本框中使用foreach選擇更高效的應用程序模型。 使用延遲計算解決了對象減少的問題,但沒有改善你的邏輯人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.