0

我正在使用一个定义了索引器的类,并希望从中获取数据并放入一个简单的数组中。有没有比遍历索引器更好的方法?

索引器:

public class MyIndexer
{
    public int Foo { get; }
    public int GetSize{ get; }  //size of data vector
    public float this[int idx] { get; set; }
}

像这样的东西会很好:

float[] data = indexer.GetData();

请注意,我无法更改MyIndexer.

4

3 回答 3

1

由于可以获得元素的数量,因此可以创建一个扩展方法:

public static float[] GetData(this MyIndexer indexer)
{
    return Enumerable.Range(0, indexer.GetSize).Select(i => indexer[i]).ToArray();
}

您也可以只使用 for 循环:

public float[] GetData(this MyIndexer indexer)
{
    float[] data = new float[indexer.GetSize];
    for(int i = 0; i < data.Length; i++)
    {
        data[i] = indexer[i];
    }
}
于 2012-08-17T18:36:00.870 回答
1

不,除了循环遍历索引之外别无他法。有很多方法可以进行循环,但没有办法绕过它。

此外,仅当索引器实际上可以返回您期望的索引的值时,循环遍历索引才有效。仅仅因为类有一个索引器并不意味着它必须被实现来处理任何特定的索引。

于 2012-08-17T18:47:39.697 回答
0

从你那里,循环将是唯一的方法。

不过,我会对课程的开发人员感到非常恼火。.NET 中有一些由众所周知的接口支持的约定;ICollection, ICollection<T>, IList,IList<T>特别贴切。

虽然数组和string的使用Length几乎是例外,但我能想到调用GetSize“GetSize”(或者实际上,以“GetXXX”形式调用属性)的唯一原因是如果我知道会正在使用课程,我真的不喜欢他们。不实施ICollection<float>更有可能是合理的,但它仍然是有充分理由的,而不是仅仅不打扰。

由于这种性质的大多数类都会实现ICollection<float>,因此在大多数情况下,您可以这样做:

float[] arr = new float[indexer.Count];
indexer.CopyTo(arr, 0);

但最奇怪的仍然是它甚至没有实现IEnumerable<float>. 这真的,真的很奇怪。它是 .NET 做事方式的核心部分,除非有充分的理由,否则它几乎是一个遗漏错误。如果有,那么您就可以完成index.ToArray()

如果我不得不经常使用这个对象,我可能会编写一个包装类或至少一组扩展方法来填补空白。

于 2012-08-17T19:08:37.303 回答