Soalan:
Memandangkan dua tatasusunan bait, satu mewakili corak dan satu lagi mengandungi data yang akan dicari, tentukan tempat dalam tatasusunan data corak itu sepadan.
Penyelesaian:
Kod yang disediakan menyediakan penyelesaian yang cekap dan ringkas menggunakan kaedah sambungan Cari:
<code class="language-csharp">public static int[] Locate(this byte[] self, byte[] candidate) { if (IsEmptyLocate(self, candidate)) return Empty; var list = new List<int>(); for (int i = 0; i < self.Length; i++) { if (i + candidate.Length > self.Length) break; bool match = true; for (int j = 0; j < candidate.Length; j++) { if (self[i + j] != candidate[j]) { match = false; break; } } if (match) list.Add(i); } return list.ToArray(); } private static bool IsEmptyLocate(byte[] self, byte[] candidate) { return self == null || self.Length == 0 || candidate == null || candidate.Length == 0 || candidate.Length > self.Length; } private static readonly int[] Empty = new int[0];</code>
Kaedah Locate berulang melalui tatasusunan data dan menyemak cara setiap kemungkinan kedudukan permulaan sepadan dengan corak. Jika ada perlawanan, rekod kedudukan ke dalam senarai jika tidak, teruskan ke kedudukan seterusnya.
Contoh:
<code class="language-csharp">// 示例字节数组 byte[] pattern = new byte[] { 12, 3, 5, 76, 8, 0, 6, 125 }; byte[] toBeSearched = new byte[] { 23, 36, 43, 76, 125, 56, 34, 234, 12, 3, 5, 76, 8, 0, 6, 125, 234, 56, 211, 122, 22, 4, 7, 89, 76, 64, 12, 3, 5, 76, 8, 0, 6, 125 }; // 定位并打印匹配位置 foreach (var position in toBeSearched.Locate(pattern)) Console.WriteLine(position);</code>
Kod ini mengubah sedikit kod asal untuk memudahkan pemahaman dan menambahkan pengendalian tatasusunan kosong dan kes yang panjang coraknya lebih besar daripada panjang data. IsEmptyLocate
Fungsi meningkatkan kebolehbacaan dan kebolehselenggaraan kod.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Cari Semua Kejadian Corak Tatasusunan Byte dengan Cekap dalam Satu Lagi dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!