[英]c# How to compare values with a 2D array
int[] a = new int[] { 1, 2, 3, 4 };
int[] b = new int[] { 5, 6, 1, 2, 7, 8 };
int Count = 0;
for (int i = 0; i < a.Length; i++)
{
for (int j = 0; j < b.Length; j++)
{
if (a[i] == b[j])
{
Count++;
break;
}
}
}
Console.WriteLine(Count);
Console.ReadLine();
上面是一個簡單的程序,可以搜索兩個數組並找到它們之間的重復項。 但是,當將第一個數組設為2D數組時遇到了困難,因為在運行“索引超出數組范圍”下面的代碼時遇到錯誤。 我真的不知道該怎么辦,因此我將不勝感激。
int[][] a = {new int[] { 1, 2, 3, 4 }, new int[] { 3, 9, 9 }};
int[] b = new int[] { 5, 6, 1, 2, 7, 8 };
int Count = 0;
for (int i = 0; i < a.Length; i++)
{
for (int j = 0; j < b.Length; j++)
{
if (b[j] == a[i][j])
{
Count++;
break;
}
}
}
Console.WriteLine(Count);
Console.ReadLine();
//initialize stuff here
for(int i = 0; i<a.length; ++i) {//iterate over the rows in a
for(int j = 0; j<a[i].length; ++j) {//iterate over columns in a
for(int k = 0; k < b.length; ++k) {//iterate over b
if(a[i][j] == b[k]) {
//increment stuff here
}//end if
}//end for k
}//end for j
//print stuff for each sub array here
}end for i
//print stuff here for all sub arrays
我假設您想在2d數組和1d數組之間找到重復項。
int[][] a = { new int[] { 1, 2, 3, 4 }, new int[] { 3, 9, 9 } };
int[] b = new int[] { 5, 6, 1, 2, 7, 8 };
int Count = 0;
for (int h = 0; h < a.Length; h++)
{
for (int i = 0; i < a[h].Length; i++)
{
for (int j = 0; j < b.Length; j++)
{
if (b[j] == a[h][i])
{
Count++;
break;
}
}
}
}
或在Linq;)
int Count = (from i in a from j in i from k in b where k == j select j).Count();
=在a2和b之間找到2個重復項?
編輯新規格
第二次編輯用於為每個2d數組元素存儲重復項。
var duplicates = new List<int>();
foreach (var i in a)
{
var duplicate = 0;
foreach (var j in i)
{
foreach (var k in b)
{
if (k == j)
{
duplicate++;
}
}
}
duplicates.Add(duplicate);
}
還是linq;)
var duplicates = a.Select(i => (from j in i from k in b where k == j select j).Count()).ToList();
更新3:對於您選擇的代碼格式:
var duplicates = new List<int>();
for (int h = 0; h < a.Length; h++)
{
var duplicate = 0;
for (int i = 0; i < a[h].Length; i++)
{
for (int j = 0; j < b.Length; j++)
{
if (b[j] == a[h][i])
{
duplicate++;
break;
}
}
}
duplicates.Add(duplicate);
}
添加重復輸出:
for (int d = 0; d < duplicates.Count; d++)
{
Console.WriteLine(duplicates[d]);
}
您可以嘗試使用foreach
foreach (var val1 in a)
{
foreach (var val2 in val1)
{
foreach (var val3 in b)
{
if (val3 == val2)
{
Count++;
}
}
}
}
或與另一個
for (int i = 0; i < a.Length; i++)
{
var innerArray = a[i];
for (int f = 0; f < innerArray.Length; f++)
{
for (int j = 0; j < b.Length; j++)
{
if (b[j] == innerArray[f])
{
Count++;
}
}
}
}
您也可以使用Linq表達式,我想它比循環要容易得多
a.SelectMany(x => x).Count(x => b.Contains(x))
您的數組a
實際上是一個包含2個元素的數組,一個元素的長度為4個元素,另一個元素的長度為3個元素。 您的內部循環正在遍歷b
每個元素的每個數組,因此,當它碰到b
的第五個元素時,與a[0][4]
相比, b[4]
越界,因為最后一個元素a[0]
的a[0][3]
是a[0][3]
,但是您試圖與a[0][4]
進行比較。 另外,您真的想在找到比賽后break
嗎?
如果要查找所有重復項,最簡單的選擇可能是@peyman,或者您可以使用注釋者@zerkms的想法Enumerable.Intersect<TSource>
,假設首先將a展平。
int[] flattened = a.SelectMany(item => item).ToArray();
Count = b.Intersect(flattened).Count();
與以下內容相同:
b.Intersect(a.SelectMany(item => item).ToArray()).Count();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.