看来,ImmutableArray上的MS文档只引用一维数组.我似乎可以将整个数组包装在ImmutableArray中,然后首先检索整个数组(在索引0处),然后在例如i,j处获取特定的值。
ImmutableArray<T[,]> arr = ImmutableArray.Create<TVal[,]>(oneDimArray);
T value = arr[0][i, j];对我来说,多维数组似乎是一个共同的需求,而且必须有更好的方法。谢谢你的帮助!
发布于 2022-11-11 07:06:10
我同意jmcilhinney的评论,即多维数组很少需要,但这也许只是我作为后端和企业开发人员几十年后的有限经验。也许还有其他领域(游戏开发?)他们更需要的地方..。
也就是说,您通常可以使用锯齿阵列而不是多维数组。这在ImmutableArray<T>中也是可能的,尽管不一定特别容易使用。
举个例子,下面是如何初始化具有默认值的n×m不可变锯齿数组:
public static ImmutableArray<ImmutableArray<T>> Initialize<T>(int n, int m, T initialValue)
{
var inner = Enumerable.Range(1, m).Select(_ => initialValue).ToImmutableArray();
return Enumerable.Range(1, n).Select(_ => inner).ToImmutableArray();
}下面是一个如何使用默认值"foo"初始化2×3数组的示例
var arr1 = Jagged.Initialize(2, 3, "foo");其中的“改变”价值观充其量只能说是尴尬的:
// Change value at (0, 1)
var arr2 = arr1.Select(
(a, i) => a.Select(
(s, j) => i == 0 && j == 1 ? "bar" : s).ToImmutableArray()).ToImmutableArray();但是,根据您需要它的目的,您可以编写帮助方法来使这种预测更容易。
由于锯齿数组是不可变的,上面的表达式不会更改原始数组arr1,而是返回一个新的锯齿数组arr2。
另一方面,数据检索很容易:
// Retrieve value at (0, 1)
string bar = arr2[0][1];正如预期的那样,bar具有"bar"值。
我经常在C#中使用不变的数据结构,但通常我只使用IEnumerable<T>。您可能已经注意到,上面的投影无论如何都会大量使用LINQ,所以除非您有大量的数据,否则不清楚为什么需要像ImmutableArray这样的东西,锯齿形的或者不像.
https://stackoverflow.com/questions/74397196
复制相似问题