如何为c#泛型集合获得一致的.count /.length属性

本文关键字:count 属性 length 泛型 集合 | 更新日期: 2023-09-27 17:49:39

List<T>具有.Count属性,其中T<>数组为.Length。我认为这是因为数组是固定长度的,而其他数组不是,但是语法上的差异仍然令人沮丧。

如果将数组重构为列表,则会给出"不包含。length的定义"错误,并且当.Count.Length本质上相同时,更改它似乎是浪费时间。

有没有好的方法来处理这个问题?是否有可能扩展List<T>以添加.Length属性,这是.Count的别名,例如,对于通用数组反之亦然?这是个坏主意吗?

如何为c#泛型集合获得一致的.count /.length属性

您可以使用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>一样使用该数组(尽管AddRemove会抛出异常,因为数组是固定长度的)

可以对List和Arrays使用.Count()方法。

如果可用,则运行.Count()方法,然后返回到传统的.Length

您可以简单地扩展泛型List并添加count方法,但是如果这样做的原因仅仅是因为您的重构而不想更新为count,我不建议这样做。如果不向类添加任何内容,则不需要扩展该类。为什么不直接更新代码,使用Count而不是Length呢?