[英]C# string array element not updating
我正在學習 Blazor 在 C# 中創建 web 應用程序。 應用程序中的頁面之一是拼字游戲。 我的實施細節如下:
問題:
Click #1: (before) red (after) blue. Click #2: (before) red (after) blue
Click #1: (before) red (after) blue. Click #2: (before) red (after) blue
點擊#2的之前應該是藍色的解決方法:
List<string>
,它可以工作。 所以我現在堅持使用 List,但我仍然更喜歡數組,因為 2D 索引訪問語法比使用list[15 * row + col]
或list[row][col]
(嵌套列表)更簡潔問題:為什么? 為什么陣列不能按預期工作? 顯然它在退出方法之前更新但之后又恢復了
編碼:
Board.cs
public class Board
{
public enum SquareKind
{
White,
DL,
TL,
DW,
TW,
Start
}
public const int SIZE = 15;
public readonly (int row, int col) StartPos = (7, 7);
public SquareKind[,] Squares = new SquareKind[SIZE, SIZE];
public Board()
{
// Initialize premium squares (including starting one)
Squares[0, 0] = SquareKind.TW;
Squares[1, 5] = SquareKind.TL;
Squares[5, 1] = SquareKind.TL;
Squares[5, 5] = SquareKind.TL;
Squares[1, 1] = SquareKind.DW;
Squares[2, 2] = SquareKind.DW;
Squares[3, 3] = SquareKind.DW;
Squares[4, 4] = SquareKind.DW;
Squares[0, 3] = SquareKind.DL;
Squares[3, 0] = SquareKind.DL;
Squares[2, 6] = SquareKind.DL;
Squares[6, 2] = SquareKind.DL;
Squares[6, 6] = SquareKind.DL;
Squares[0, 14] = SquareKind.TW;
Squares[1, 9] = SquareKind.TL;
Squares[5, 13] = SquareKind.TL;
Squares[5, 9] = SquareKind.TL;
Squares[1, 13] = SquareKind.DW;
Squares[2, 12] = SquareKind.DW;
Squares[3, 11] = SquareKind.DW;
Squares[4, 10] = SquareKind.DW;
Squares[0, 11] = SquareKind.DL;
Squares[3, 14] = SquareKind.DL;
Squares[2, 8] = SquareKind.DL;
Squares[6, 12] = SquareKind.DL;
Squares[6, 8] = SquareKind.DL;
Squares[14, 14] = SquareKind.TW;
Squares[13, 9] = SquareKind.TL;
Squares[9, 13] = SquareKind.TL;
Squares[9, 9] = SquareKind.TL;
Squares[13, 13] = SquareKind.DW;
Squares[12, 12] = SquareKind.DW;
Squares[11, 11] = SquareKind.DW;
Squares[10, 10] = SquareKind.DW;
Squares[14, 11] = SquareKind.DL;
Squares[11, 14] = SquareKind.DL;
Squares[12, 8] = SquareKind.DL;
Squares[8, 12] = SquareKind.DL;
Squares[8, 8] = SquareKind.DL;
Squares[14, 0] = SquareKind.TW;
Squares[13, 5] = SquareKind.TL;
Squares[9, 1] = SquareKind.TL;
Squares[9, 5] = SquareKind.TL;
Squares[13, 1] = SquareKind.DW;
Squares[12, 2] = SquareKind.DW;
Squares[11, 3] = SquareKind.DW;
Squares[10, 4] = SquareKind.DW;
Squares[14, 3] = SquareKind.DL;
Squares[11, 0] = SquareKind.DL;
Squares[12, 6] = SquareKind.DL;
Squares[8, 2] = SquareKind.DL;
Squares[8, 6] = SquareKind.DL;
Squares[7, 0] = SquareKind.TW;
Squares[0, 7] = SquareKind.TW;
Squares[14, 7] = SquareKind.TW;
Squares[7, 14] = SquareKind.TW;
Squares[3, 7] = SquareKind.DL;
Squares[7, 3] = SquareKind.DL;
Squares[7, 11] = SquareKind.DL;
Squares[11, 7] = SquareKind.DL;
Squares[StartPos.row, StartPos.col] = SquareKind.Start;
}
}
拼字游戲.razor
@page "/scrabble"
@Init()
<table class="scrabble-board">
<tbody>
@for (int i = 0; i < 15; i++)
{
<tr>
@for (int j = 0; j < 15; j++)
{
var (row, col) = (i, j); // Must store i, j here as row, col for callback with parameter using i and j
<td class="scrabble-board"
style="background-color: @squareColors[row, col]"
@onclick="@(() => SquareOnClick(row, col))" />
}
</tr>
}
</tbody>
</table>
拼字游戲.razor.cs
public partial class Scrabble
{
string[,] squareColors = new string[Board.SIZE, Board.SIZE];
readonly Dictionary<Board.SquareKind, string> colors = new Dictionary<Board.SquareKind, string>
{
[Board.SquareKind.White] = "#DDE0DE",
[Board.SquareKind.DL] = "#87D7F6",
[Board.SquareKind.TL] = "#25A9DC",
[Board.SquareKind.DW] = "#F68787",
[Board.SquareKind.TW] = "#DB1B1B",
[Board.SquareKind.Start] = "#25DC88"
};
Board board = new Board();
string Init() // Method returns a null string to be able to run directly on the Blazor page without compiling error
{
for (int i = 0; i < Board.SIZE; i++)
for (int j = 0; j < Board.SIZE; j++)
{
var kind = board.Squares[i, j];
squareColors[i, j] =colors[kind];
}
return null;
}
void SquareOnClick(int row, int col)
{
Console.Write("(before) {0} ", squareColors[0, 0]);
squareColors[0, 0] = squareColors[row, col];
Console.WriteLine("(after) {0}", squareColors[0, 0]);
}
}
為了更好看,我還使用了以下 CSS (在wwwroot/index.html中引用)
.scrabble-board table {
width: 100%;
padding-top: 100%
}
.scrabble-board td {
border: 1px solid black;
border-radius: 5px;
width: 50px;
height: 50px;
background-size: contain;
}
刪除@Init()
並通過覆蓋OnInitialized()
進行初始化
using Microsoft.AspNetCore.Components;
public partial class Scrabble : ComponentBase
{
...
protected override void OnInitialized()
{
for (int i = 0; i < Board.SIZE; i++)
for (int j = 0; j < Board.SIZE; j++)
{
var kind = board.Squares[i, j];
squareColors[i, j] = colors[kind];
}
}
...
每次重繪渲染片段時,您都會初始化板。 將 0,0 設置為其默認紅色。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.