foreach (String s in arrayOfMessages)
{
System.Console.WriteLine(s);
}
string[,] arrayOfMessages
作为参数传入。
我希望能够确定哪些字符串来自arrayOfMessages[0,i]
和arrayOfMessages[n,i]
,其中n
是数组的最终索引。
答案 0 :(得分:36)
只需使用两个嵌套的for
循环。要获取尺寸的大小,您可以使用GetLength()
:
for (int i = 0; i < arrayOfMessages.GetLength(0); i++)
{
for (int j = 0; j < arrayOfMessages.GetLength(1); j++)
{
string s = arrayOfMessages[i, j];
Console.WriteLine(s);
}
}
这假设您确实拥有string[,]
。在.Net中,也可以使用不从0开始索引的多维数组。在这种情况下,它们必须在C#中表示为Array
,您需要使用GetLowerBound()
和{{1获取每个维度的边界。
答案 1 :(得分:7)
不要使用foreach
- 使用嵌套的for
循环,一个用于数组的每个维度。
您可以使用GetLength
方法获取每个维度中的元素数量。
答案 2 :(得分:7)
使用嵌套for循环:
for (int row = 0; row < arrayOfMessages.GetLength(0); row++)
{
for (int col = 0; col < arrayOfMessages.GetLength(1); col++)
{
string message = arrayOfMessages[row,col];
// use the message
}
}
答案 3 :(得分:2)
看起来你找到了一个适合你的问题的答案,但是因为标题要求一个多维数组(我读作2 或更多),这是我得到的第一个搜索结果在搜索时,我会添加我的解决方案:
public static class MultidimensionalArrayExtensions
{
/// <summary>
/// Projects each element of a sequence into a new form by incorporating the element's index.
/// </summary>
/// <typeparam name="T">The type of the elements of the array.</typeparam>
/// <param name="array">A sequence of values to invoke the action on.</param>
/// <param name="action">An action to apply to each source element; the second parameter of the function represents the index of the source element.</param>
public static void ForEach<T>(this Array array, Action<T, int[]> action)
{
var dimensionSizes = Enumerable.Range(0, array.Rank).Select(i => array.GetLength(i)).ToArray();
ArrayForEach(dimensionSizes, action, new int[] { }, array);
}
private static void ArrayForEach<T>(int[] dimensionSizes, Action<T, int[]> action, int[] externalCoordinates, Array masterArray)
{
if (dimensionSizes.Length == 1)
for (int i = 0; i < dimensionSizes[0]; i++)
{
var globalCoordinates = externalCoordinates.Concat(new[] { i }).ToArray();
var value = (T)masterArray.GetValue(globalCoordinates);
action(value, globalCoordinates);
}
else
for (int i = 0; i < dimensionSizes[0]; i++)
ArrayForEach(dimensionSizes.Skip(1).ToArray(), action, externalCoordinates.Concat(new[] { i }).ToArray(), masterArray);
}
public static void PopulateArray<T>(this Array array, Func<int[], T> calculateElement)
{
array.ForEach<T>((element, indexArray) => array.SetValue(calculateElement(indexArray), indexArray));
}
}
用法示例:
var foo = new string[,] { { "a", "b" }, { "c", "d" } };
foo.ForEach<string>((value, coords) => Console.WriteLine("(" + String.Join(", ", coords) + $")={value}"));
// outputs:
// (0, 0)=a
// (0, 1)=b
// (1, 0)=c
// (1, 1)=d
// Gives a 10d array where each element equals the sum of its coordinates:
var bar = new int[4, 4, 4, 5, 6, 5, 4, 4, 4, 5];
bar.PopulateArray(coords => coords.Sum());
一般的想法是通过尺寸递减。我确信这些功能不会赢得效率奖励,但它可以作为我的格子的一次性初始化器,并带有一个足够好的ForEach来暴露价值和指数。我还没有解决的主要缺点是让它自动识别阵列中的T,因此在类型安全方面需要谨慎。
答案 4 :(得分:1)
这样的事情会起作用:
int length0 = arrayOfMessages.GetUpperBound(0) + 1;
int length1 = arrayOfMessages.GetUpperBound(1) + 1;
for(int i=0; i<length1; i++) { string msg = arrayOfMessages[0, i]; ... }
for(int i=0; i<length1; i++) { string msg = arrayOfMessages[length0-1, i]; ... }
答案 5 :(得分:0)
您可以使用以下代码运行多维数组。
foreach (String s in arrayOfMessages)
{
System.Console.WriteLine("{0}",s);
}
答案 6 :(得分:0)
更实用的方法是使用LINQ,我总是发现它比循环更好。它使代码更具可维护性和可读性。下面给出的代码段显示了一种使用Method或Fluent LINQ语法的解决方案。
string[,] arrayOfMessages = new string[3, 2] { { "Col1","I am message 1" }, { "Col2", "I am message 2" }, { "Col3", "I am message 3" } };
var result = arrayOfMessages.Cast<string>()
.Where((msg, index) => index % 2 > 0);
foreach (var msg in result)
{
Console.WriteLine(msg);
}
LINQ扩展方法不适用于多维数组,因为它们未实现IEnumerable<T>
接口。这就是Cast<T>
出现的地方。它基本上将整个数组转换为IEnumerable<T>
。在我们的情况下,它将把多维数组展平为IEnumerable<string>
,例如:
{ "Col1", "I am message 1", "Col2", "I am message 2", "Col3", "I am message 3" }
您也可以使用OfType<T>
代替Cast<T>
。它们之间的唯一区别是,在使用混合数据类型的集合的情况下,OfType<T>
会忽略无法转换的值,而Cast<T>
会抛出InValidCastException。
接下来,我们要做的就是应用LINQ运算符,该运算符忽略(或过滤掉)偶数索引处的值。因此,我们使用Where
运算符的重载,其Func委托的类型为Func<TSource, int, bool>
,其中TSource
是集合中的每个项目,int
是其中的项目的索引集合,bool
是返回类型。
在上面的代码段中,我使用了一个lambda表达式,该表达式对每个项目索引进行求值,并且仅在其为奇数时才返回true。