1

我需要从数组中获取数组片段。我厌倦了使用 Array.Copy()。new ArraySegment(..).Array 返回原始的 [full] 数组。下面是我想出来的,但我觉得它很蹩脚。有一个更好的方法吗?

class Program
{
    static void Main(string[] args)
    {
        var arr = new ArraySegment<byte>(new byte[5] { 5, 4, 3, 2, 1 }, 0, 2).ArrayFragment();
        for (int i = 0; i < arr.Length; i++)
            Console.WriteLine(i);
        Console.Read();
    }
}

static class Extensions
{
    public static T[] ArrayFragment<T>(this ArraySegment<T> segment)
    {
        var arr = new T[segment.Count];
        Array.Copy(segment.Array, segment.Offset, arr, 0, segment.Count);
        return arr;
    }
}

提前致谢。

更新:以上只是一个例子。
我有一个方法:byte [] CalculateXXX(byte [] key, byte [] message); 我在这个方法中进行数组操作。我想返回数组的一部分。ArraySegment 不实现 IEnumerable 并且它不返回仅包含段的数组 new ArraySegment(arr...).Array 返回完整的原始数组。

var rval = new byte[4]; //new ArraySegment(finalOutputBuffer, 0, 4).SegmentedArray(); Array.Copy(finalOutputBuffer, 0, rval, 0, 4);

我发现我必须执行上述操作才能返回一个数组片段。只是想知道是否有更好的方法来返回数组的片段[作为新数组]。

4

3 回答 3

1

定义更好。ArraySegment 的缺点是什么?你有什么问题没有解决?


编辑:好的,我现在理解你的观点,但这是错误的。从某种意义上说,它可能是一个错误,您认为它应该做更多的事情,但它确实做了它应该做的事情。它允许您将有关您希望使用的数组以及要使用的数组部分的信息传递给一段代码。

它不提供 IEnumerable 或任何可以让您狭隘地查看数组的东西,即。x[0] 不会给你段的第一个元素,你也不能遍历它。

所以是的,它本身是没有用的,但你无法得到本质上一个数组的东西,但它也是一个更大数组的一部分。

您可以轻松创建自己的类集合类,该类引用数组并将数组用作存储,并提供索引、枚举等。

但这不是这个结构的作用。我想这里的主要问题是他们通过它的名字让你对它有更多的期望。

于 2008-12-19T18:11:08.090 回答
1

Vyas,我真的很抱歉发布了这么多无用的****. 自从我实际使用以来已经有很多年ArraySegment了,我只是假设它实现了一个(或多或少)一致的接口。有人(乔恩?)请告诉我在执行这个无用结构的过程中使用了哪些药物。

最后,长话短说,最好的解决方案可能是实现你自己的版本ArraySegment,只做对。

我不明白您使用ArraySegment. 如果这就是您的意思,这里不涉及额外的开销,因为没有复制原始数据。相反,ArraySegment提供数据的轻量级视图。

为了使这项工作,将您的(返回)类型从 更改T[]IEnumerable<T>,或者,如果您需要索引访问,更改为IList<T>。通常更喜欢在方法签名中使用接口类型,并完全避免使用数组类型。理由很简单:它可以让您的问题消失,并使界面更加灵活和面向未来。它还提供了更好的信息隐藏,因为它隐藏了与此方法的使用者无关的部分实现。

于 2008-12-18T23:15:51.600 回答
0

顺便说一句,C# 中迭代​​器设计不佳的另一个副作用。有许多类似的实例(就像“lame”一样),其中只需简单的良好设计就能够通过或指向或控制段(又名称为范围的概念)而无需所有的古老的 shickanery .. 复制语义与否,数组也是一个定义明确的概念。

只需使用 C++。:-)

于 2009-04-13T22:52:34.333 回答