Wie, um Werte in ein mehrdimensionales array mit einer linearen index
Was ist die effizienteste Möglichkeit, Werte in C# multi-dimensional arrays mit einem index? Zum Beispiel bestimmten ein array...
int[,,] arr2 = { {{0,1,2}, {3,4,5}, {6,7,8}}
, {{9,10,11}, {12,13,14}, {15,16,17}}
, {{18,19,20}, {21,22,23}, {24,25,26}}
};
Wie kann ich alle Elemente 30 mit einem linearen index ...
//This code does not work
for (int i = 0; i < arr.Length; i++)
{
arr.SetValue(30, i);
}
Offenbar die SetValue() oben funktioniert nicht mit mehrdimensionalen arrays.
Hier ist die beste Lösung, ich könnte mit kommen...
EDIT: Hinzugefügt einige Klarstellungen zu dem code...
static class Program
{
static void Main(string[] args)
{
//Sample input.
int[,,] arr2 = { {{0,1,2}, {3,4,5}, {6,7,8}}
, {{9,10,11}, {12,13,14}, {15,16,17}}
, {{18,19,20}, {21,22,23}, {24,25,26}}
};
int[] arr1 = { 1, 2, 3, 4 };
setElementsTo30(arr2);
setElementsTo30(arr1);
}
//Must be able to process int arrays of arbitrary dimensions and content
private static void setElementsTo30(Array arr)
{
IList<int> cumulativeLength = getCumulativeLengths(arr);
for (int i = 0; i < arr.Length; i++)
{
SetValue(arr, i, 30, cumulativeLength);
}
}
public static void SetValue(this Array arr, int index, object value, IList<int> cumulativeLength)
{
int[] arrayIndex = new int[arr.Rank];
for (int dim = arr.Rank-1; dim >= 0; dim--)
{
arrayIndex[dim] = index / cumulativeLength[dim] % arr.GetLength(dim);
}
arr.SetValue(value, arrayIndex);
}
private static IList<int> getCumulativeLengths(Array arr)
{
List<int> lengths = new List<int>(arr.Rank);
for (int dim = 0; dim < arr.Rank; dim++)
{
int prod = 1;
for (int i = dim + 1; i < arr.Rank; i++)
{
prod *= arr.GetLength(i);
}
lengths.Add(prod);
}
return (IList<int>)lengths;
}
}
Gibt es eine Möglichkeit, das gleiche zu tun, effizienter und eventuell mit etwas versehen, indem das framework selbst (D. H. etwas, das verwendet werden kann, ohne viel Aufwand.)
Dank,
SDX2000.
Du musst angemeldet sein, um einen Kommentar abzugeben.
warum müssen Sie das IList ?
Test-Code:
Wissen Sie, wie viele Tupel existieren wird zunächst? Wenn Sie sagen, eine matrix mit den Abmessungen a x b x c x d, konnte nicht verwenden Sie den folgenden, um eine Liste mit allen Indizes:
So, dass, wie der Zähler rollt sich über verschiedene Grenzen, werden mit jedem weiteren index erhöht. Wenn es mehr werden, bedeutet dies verallgemeinern zu einem n-Tupel einfach die Multiplikation vorherigen Werte. Man könnte Umgekehrt die Arithmetik der Indizes, wenn man wollte traverse in einer anderen Weise.
SetValue()
funktionieren sollte. Werfen Sie einen Blick auf diese für ein wenig mehr inspiration.EDIT: Könnte man nicht einfach
Als Seite beachten, sind Sie sicher, dass Sie zurückkehren möchten, eine
IList<int>
ausgetCumulativeLengths
?Ich dachte immer, großzügig auf input, und streng auf Leistung.