是否有任何标准方法可以根据索引键的范围从具有索引器的对象中获取对象数组
本文关键字:索引 数组 取对象 获取 范围 对象 方法 标准 任何 是否 | 更新日期: 2023-09-27 18:19:00
作为输入,我有实现IDataRecord(一些抽象表的行)的对象,所以它有索引器,并通过给它一些整数,我可以检索某些类型的对象。作为输出,我的代码必须在该行中获得一定范围的单元格作为给定类型对象的数组。
所以我写了这个方法(是的,我知道,它可以很容易地转换为扩展方法,但我不需要这个,而且我也不想让这个方法在我的类之外可见):
private static T[] GetRange<T>(IDataRecord row, int start, int length)
{
var result = new List<T>();
for (int i = start; i < (start + length); i++)
{
result.Add((T)row[i]);
}
return result.ToArray();
}
它工作得很好,但是这个方法逻辑看起来很常见。那么,是否有任何方法可以在。net框架FCL/BCL中给出相同(或几乎相同)的结果?
使用Skip and Take
var rangeList = result.Skip(start - 1).Take(length);
不,它不在BCL中。
你不应该先创建一个List<>
,然后将其复制到数组中。要么返回List<>
本身(并使用适当的初始容量构造它),要么立即创建数组,如下所示:
private static T[] GetRange<T>(IDataRecord row, int start, int length)
{
var result = new T[length];
for (int i = 0; i < length; i++)
{
result[i] = (T)row[start + i];
}
return result;
}
这里有一个替代方案(对于所有LINQ爱好者):
// NB! Lazy enumeration
private static IEnumerable<T> GetRange<T>(IDataRecord row, int start, int length)
{
return Enumerable.Range(start, length).Select(i => (T)row[i]);
}
我们在这里重复在对问题的评论中所说的:接口System.Data.IDataRecord
(在System.Data.dll
汇编中)不继承IEnumerable<>
或IEnumerable
。
如果你想'TakeARange',你应该有一个集合作为输入参数。这里你没有。
你只有一个IDataRecord(例如;具有索引器的单行。您应该公开一个名为Cells的属性,该属性返回您在索引器实现中使用的列表。
你的方法应该是这样的:
private static T[] TakeRange<T>(IEnumerable cells, int start, int length)
{
return cells.Skip(start - 1).Take(length)
}
嗯…在FCL/BCL中似乎没有这样的方法