我正在使用一个已经定义了索引器的类,并希望从中获取数据并将其转换为一个简单的数组。有没有比循环索引器更好的方法?
索引器:
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
。
答案 0 :(得分: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];
}
}
答案 1 :(得分:1)
不,除了循环索引之外别无他法。有许多方法可以进行循环,但没有办法解决它。
此外,仅当索引器实际上可以返回您期望的索引的值时,循环索引才有效。仅仅因为类有一个索引器并不意味着它必须被实现来处理任何特定的索引。
答案 2 :(得分: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()
。
如果我不得不使用这个对象,我可能会编写一个包装类或至少一组扩展方法来填补空白。