gpt4 book ai didi

c# - 在 C# 中使用 LINQ 从二维数组 (int[ , ]) 中获取切片

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:52 25 4
gpt4 key购买 nike

我不是 C# 专家,也不是 LINQ 的初学者,在 SO 和 Google 中搜索了一下,但没有发现如何执行以下操作:

如果我有,比方说,int[10,10] 数组,我如何从中获取二维切片?

例如,如果上述数组中的值取决于它们的位置(a[2,3] = 23、a[4,8] = 48 等),我想执行以下伪代码:

int[3,3] a_slice = slicer_method(a, 3, 6, 2, 5)   // or anything equivalent to this

> [[ 32, 33, 34],
[ 42, 43, 44],
[ 52, 53, 54]]

它没有专门使用 LINQ,但我已经看到 LINQ 在我最近遇到的每个类似操作中使用。

最佳答案

@JaredPar 是正确的,没有内在的方法来做切片——也就是说,你可以设计一个扩展方法来做到这一点:

public static class Ext
{
public static T[] Slice<T>(this T[] source, int fromIdx, int toIdx)
{
T[] ret = new T[toIdx - fromIdx + 1];
for(int srcIdx=fromIdx, dstIdx = 0; srcIdx <= toIdx; srcIdx++)
{
ret[dstIdx++] = source[srcIdx];
}
return ret;
}
public static T[,] Slice<T>(this T[,] source, int fromIdxRank0, int toIdxRank0, int fromIdxRank1, int toIdxRank1)
{
T[,] ret = new T[toIdxRank0 - fromIdxRank0 + 1, toIdxRank1 - fromIdxRank1 + 1];

for(int srcIdxRank0=fromIdxRank0, dstIdxRank0 = 0; srcIdxRank0 <= toIdxRank0; srcIdxRank0++, dstIdxRank0++)
{
for(int srcIdxRank1=fromIdxRank1, dstIdxRank1 = 0; srcIdxRank1 <= toIdxRank1; srcIdxRank1++, dstIdxRank1++)
{
ret[dstIdxRank0, dstIdxRank1] = source[srcIdxRank0, srcIdxRank1];
}
}
return ret;
}
}

还有一个测试:

void Main()
{
var singleArr = new int[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
singleArr.Slice(2, 4).Dump();
var doubleArr = new int[,]
{
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
};
doubleArr.Slice(2, 4, 2, 4).Dump();
}

关于c# - 在 C# 中使用 LINQ 从二维数组 (int[ , ]) 中获取切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15281616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com