如何为c#泛型集合获得一致的.count /.length属性
本文关键字:count 属性 length 泛型 集合 | 更新日期: 2023-09-27 17:49:39
List<T>
具有.Count
属性,其中T<>
数组为.Length
。我认为这是因为数组是固定长度的,而其他数组不是,但是语法上的差异仍然令人沮丧。
如果将数组重构为列表,则会给出"不包含。length的定义"错误,并且当.Count
和.Length
本质上相同时,更改它似乎是浪费时间。
有没有好的方法来处理这个问题?是否有可能扩展List<T>
以添加.Length
属性,这是.Count
的别名,例如,对于通用数组反之亦然?这是个坏主意吗?
您可以使用LINQ提供的Count
方法。
这被优化为在可能的情况下使用ICollection<T>
接口提供的Count
属性(或者在。net 4中也使用非通用的ICollection
接口)。因此数组,List<T>
等都将被优化。
var yourList = new List<string> { "the", "quick", "brown", "fox" };
int count1 = yourList.Count(); // uses the ICollection<T>.Count property
var yourArray = new[] { 1, 2, 4, 8, 16, 32, 64, 128 };
int count2 = yourArray.Count(); // uses the ICollection<T>.Count property
var yourEnumerable = yourArray.Where(x => x > 42);
int count3 = yourEnumerable.Count(); // no optimisation, iterates the sequence
或者,如果您想要某种类型的一致计数属性,而不冒在非优化情况下迭代整个序列的风险,那么您可以创建自己的扩展方法。(我个人不会走这条路。)
int count4 = yourList.GetCount(); // uses the ICollection<T>.Count property
int count5 = yourArray.GetCount(); // uses the ICollection<T>.Count property
int count6 = yourEnumerable.GetCount(); // compile-time error
// ...
public static class CollectionExtensions
{
public static int GetCount<T>(this ICollection<T> source)
{
if (source == null) throw new ArgumentNullException("source");
return source.Count;
}
public static int GetCount(this ICollection source)
{
if (source == null) throw new ArgumentNullException("source");
return source.Count;
}
}
可以将数组放入类型为IList<T>
的变量中。(数组实现这个接口)
然后您可以像使用任何其他IList<T>
一样使用该数组(尽管Add
和Remove
会抛出异常,因为数组是固定长度的)
可以对List和Arrays使用.Count()
方法。
如果可用,则运行.Count()
方法,然后返回到传统的.Length
。
您可以简单地扩展泛型List并添加count方法,但是如果这样做的原因仅仅是因为您的重构而不想更新为count,我不建议这样做。如果不向类添加任何内容,则不需要扩展该类。为什么不直接更新代码,使用Count而不是Length呢?