我有一些帶有名稱的串列:group1、group2、group3... 我需要一個 for 回圈(比如說 for (int i=1; i<=6; i ),現在我檢查例如我是否是1 然后使用 group1,如果 i 是 2 使用 group2 等等...我的問題是,我可以呼叫最后帶有“i”的串列嗎?就像 groupi,當 i 為 1 時,它的 group1,當 i 是 2 時,它group2 等。這是代碼:
for (int i = 0; i < groupNum; i )
{
if (i == 0)
{
foreach (Player p1 in group1)
{
foreach (Player p2 in group1)
{
if (p1 != p2)
{
if (group1.IndexOf(p1) > group1.IndexOf(p2))
{
Game game = new Game(tournamentID, p1.id, p2.id);
game.status = "Pending";
gm.CreateGame(game);
}
}
}
}
}
else if (i == 1)
{
foreach (Player p1 in group2)
{
foreach (Player p2 in group2)
{
if (p1 != p2)
{
if (group2.IndexOf(p1) > group2.IndexOf(p2))
{
Game game = new Game(tournamentID, p1.id, p2.id);
game.status = "Pending";
gm.CreateGame(game);
}
}
}
}
}
else if (i == 2)
{
foreach (Player p1 in group3)
{
foreach (Player p2 in group3)
{
if (p1 != p2)
{
if (group3.IndexOf(p1) > group3.IndexOf(p2))
{
Game game = new Game(tournamentID, p1.id, p2.id);
game.status = "Pending";
gm.CreateGame(game);
}
}
}
}
}
else if (i == 3)
{
foreach (Player p1 in group4)
{
foreach (Player p2 in group4)
{
if (p1 != p2)
{
if (group4.IndexOf(p1) > group4.IndexOf(p2))
{
Game game = new Game(tournamentID, p1.id, p2.id);
game.status = "Pending";
gm.CreateGame(game);
}
}
}
}
}
else if (i == 4)
{
foreach (Player p1 in group5)
{
foreach (Player p2 in group5)
{
if (p1 != p2)
{
if (group5.IndexOf(p1) > group5.IndexOf(p2))
{
Game game = new Game(tournamentID, p1.id, p2.id);
game.status = "Pending";
gm.CreateGame(game);
}
}
}
}
}
else if (i == 5)
{
foreach (Player p1 in group6)
{
foreach (Player p2 in group6)
{
if (p1 != p2)
{
if (group6.IndexOf(p1) > group6.IndexOf(p2))
{
Game game = new Game(tournamentID, p1.id, p2.id);
game.status = "Pending";
gm.CreateGame(game);
}
}
}
}
}
如您所見,不同 if 陳述句的代碼實際上是相同的,但唯一的區別在于使用具有相似名稱的不同串列(group1、group2..)。
uj5u.com熱心網友回復:
創建一個組串列
var groups = new List<Group>(){
group1, group1, group3};
現在你可以做
if(group[i].Indexof.....)
ETC
uj5u.com熱心網友回復:
假設它們在List<Player>下面,只需制作一組您的組,然后對其進行迭代:
foreach(var grp in new List<Player>[] {group1, group2, group3, group4, group5, group6}) {
foreach (Player p1 in grp)
{
foreach (Player p2 in grp)
{
if (p1 != p2)
{
if (grp.IndexOf(p1) > grp.IndexOf(p2))
{
Game game = new Game(tournamentID, p1.id, p2.id);
game.status = "Pending";
gm.CreateGame(game);
}
}
}
}
}
uj5u.com熱心網友回復:
一般來說
這經常出現。不; 您不能以編程方式構建變數名稱。到編譯代碼時,變數名已經消失了
如果你曾經有過類似名字的變數
something1
something2
something3
等等,那么這是使用陣列的候選者,但請記住陣列從 0 開始
var something = new Thing[3];
(在您的情況下,事物是例如玩家)
現在你的名字中可以有一個固定的部分和一個可變的部分:
Before you had Now you have
-------------- ------------
something1 something[0]
something2 something[1]
something3 something[2]
陣列可以用foror回圈foreach,并且可以使用上面的硬編碼索引隨機訪問。就像你的代碼只有 3 個變數命名somethingX你的陣列也有固定數量的 3 個值。陣列不增長
如果您需要像陣列一樣作業但確實會增長的東西,請使用 List:
var something = new List<Thing>();
這是一個 Thing 串列,就像之前有一個 Thing 陣列一樣。
另外,不要忘記字典,它們就像串列一樣,因為它們會增長,但它們可以被任何東西索引,因此您可以以編程方式構建索引,與由遞增整數索引的陣列/串列不同,字典可以跳過一些索引:
var dict = new Dictionary<int, Thing>();
這意味著“由 int 索引并保存事物的字典”
現在,這是可能的:
dict[1] = new Thing();
dict[2] = new Thing();
dict[4] = new Thing(); //we skipped
鍵可以是任何東西,例如字串:
var dict = new Dictionary<string, Thing>();
dict["something1"] = new Thing();
dict["something2"] = new Thing();
dict["sometheng4"] = new Thing(); //watch out for typos!
您可以以編程方式構建密鑰:
int x = 1;
dict["something" x].SomePropertyOfThing = "Hello";
唯一需要注意的是字典不一定以任何順序存盤它的內容。如果你foreach這樣做,你可能會按something2, sometheng4, something1順序排列條目。如果您需要排序,您要么必須排序dict.Keys,然后使用它來訪問字典,要么根據您的需要使用 SortedDictionary 或 OrderedDictionary
總之,這些是我們在 C# 中使用的主要型別的集合;他們有不同的優勢和劣勢,選擇在某種情況下使用哪個通常是一個重要的工程決策
最后一點;在處理集合時盡量使用復數名稱,因為它使代碼更容易推理
具體在這種情況下
在您的特定情況下,您實際上是在尋找一個陣列陣列,并且一些 LINQ 可能會使您的代碼更容易處理:
var groups = new []{ group1, group2, group3 };
foreach(var g in groups)
foreach(var p1 in g)
foreach(var p2 in g.Where(p => p.id > p1.id))
gm.CreateGame(new Game(tournamentID, p1.id, p2.id){status = "Pending"});
如果您只想為特定組 N 制作一場錦標賽,foreach(var g in groups)請將var g = groups[N]
這個邏輯你有“對于每個玩家1,對于每個玩家2,如果他們不是同一個玩家,找到玩家1的索引,找到玩家2的索引,如果一個索引小于兩個index”包含冗余邏輯,查找已經找到的東西會浪費資源
說“對于組中的每個 player1,對于每個 id 大于 player1 的 player2”都會消除所有這些。玩家 2 必須是與玩家 1 不同的玩家,因為他們的 id 更大。無需查找索引;您可以縮短代碼以比較 ID,而不是進行 notequals 檢查然后查找索引然后進行比較
如果您的 ID 值由于某種原因在本質上不能比某種意義上更大(我假設它們是整數),您可以使用更多的 linq 將索引 i 分配給組中的每個玩家 p :
var groups = new []{
group1.Select((p,i) => (p,i)),
group2.Select((p,i) => (p,i)),
group3.Select((p,i) => (p,i))
};
這構成了玩家的元組,以及他們所在的索引,因此與以前類似的邏輯可以作業:
foreach(var g in groups)
foreach(var p1t in g)
foreach(var p2t in g.Where(pt => pt.i > p1t.i))
gm.CreateGame(new Game(tournamentID, p1t.p.id, p2t.p.id){status = "Pending"});
這次 Where 要求玩家 2 的索引 i 更大
您應該使用 PascalCase 命名您的屬性,而不是 camelCase
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/479427.html
下一篇:如何“雙爆”?
