string[] arrStr = { "a", "b", "c" };
        return arrStr.Count(p=>p==str);
使用上面代码时发现Count是调用Enumerable中方法,F12看了下strimg继承的几个接口中IEnumerable和Enumerable,最相似,但里面只有一个GetEnumerator的函数,然后就不知道到底和Enumerable怎么关联的了,想问下大哥们其中用到了那些技术,还有题目中的问题,都解答下吧,回答好了再加分.https://referencesource.microsoft.com/#mscorlib/system/string.cs,8281103e6f23cb5c

解决方案 »

  1.   

    添加 Using System.Linq;
      

  2.   

    都是附加方法了,类似于
    public staticc class StringEx
    {
               public int (this string @string,Exp 表达式)
               {             }
    }
      

  3.   

    Count方法是通过 System.Linq 进行扩展的,方法定义的参数中含有 this 关键字即可实现。
      

  4.   

    count是IEnumerable<T> 的扩展方法
      

  5.   

    标题写错了,应该是  数组类型是怎么调用Enumerable中的方法的?
    看了一些2楼的解答,了解了System.Linq的一些东西,
    https://www.cnblogs.com/YeYunRong/p/5212201.html
    如上面连接文章中所说,数组可已说既是一个枚举数(Enumerator)也是一个可枚举类型(Enumerable)
    我的疑惑是数组类型是怎么调用Enumerable中的成员方法的,虽说继承是可以实现这些的,但没找到
      

  6.   

     这里IEnumerable<T>是因为Array类继承的IEnumerable吗,如果是为什么它不是IEnumerable<T>
    2.https://www.php.cn/csharp-article-357797.html
    这里的
    IEnumerator IEnumerable.GetEnumerator() {  foreach (T t in dataList)  {  yield return t;  }
    返回T类型转为基类形,有什么作用(完整代码在下面)
    public class PhonePackage<T> : IEnumerable<T>  { private List<T> dataList = null; public void Add(T t) {  if (dataList == null)  dataList = new List<T>();  dataList.Add(t); } public IEnumerator<T> GetEnumerator() {  foreach (T t in dataList)  {  yield return t;  } } IEnumerator IEnumerable.GetEnumerator() {  foreach (T t in dataList)  {  yield return t;  } } }
      

  7.   

    唉,这种研究方法要不得,这里有几位跟你差不多的研究方式的,快4年了,天天研究有多少种“回”字。但是看贴出代码么,赶不上学半年的研究那么多,回字到底怎么写。为啥不一步定位,直接断言  string[] te = new String[] {"a", "b", "c"};            if (te is IEnumerable<string>)
                {            }他能进这个if判定了,结果是进了。ok,你还纠结啥。string[]  is  IEnumerable<string> 断言是真。 至于为啥,因为他实现了 IList<T>
    至于你后面问的,同样不需要纠结。现在正在大学招生。好了foreach (考生 t in 达到标准的考生列表)
    {
    }你问我为啥要转考生,没有为啥。我是招生办的,我只关心考生,不关心你姓什么,叫什么,那个地区的
    ps:纠结那些东西没啥用,底下是给机器看的,从纠结机器看的东西,忘了人的想法,你追求的是什么?我追求的是“用计算机解决人类的问题”,你想追求什么“我要把自己思维变成机器思维”
      

  8.   

    这里IEnumerable<T>是因为Array类继承的IEnumerable吗
    首先,泛型和非泛型,不一样。
    我们先看一下 List。它同时需要实现IEnumerable和IEnumerable<T>我们在仔细看一下IEnumerable<T>,发现它也要继承自IEnumerable
    所以结论其实很简单,IEnumerable<T>和IEnumerable就是两个类,不一样。
    然后我们稍微说一下,为什么List需要实现IEnumerable<T>和IEnumerable,但是IEnumerable<T>本来就需要实现IEnumerable,这样是重复的。
    这个问题,看过蛮多答案的。后来感觉可能由于微软为了方便代码阅读吧。2 返回T类型转为基类形,有什么作用
    你要看一下是yield return t;
    这个关键字,你自己百度一下就明白了。
    并不是返回了单独的T
      

  9.   

    这里IEnumerable<T>是因为Array类继承的IEnumerable吗
    首先,泛型和非泛型,不一样。
    我们先看一下 List。它同时需要实现IEnumerable和IEnumerable<T>我们在仔细看一下IEnumerable<T>,发现它也要继承自IEnumerable
    所以结论其实很简单,IEnumerable<T>和IEnumerable就是两个类,不一样。
    然后我们稍微说一下,为什么List需要实现IEnumerable<T>和IEnumerable,但是IEnumerable<T>本来就需要实现IEnumerable,这样是重复的。
    这个问题,看过蛮多答案的。后来感觉可能由于微软为了方便代码阅读吧。2 返回T类型转为基类形,有什么作用
    你要看一下是yield return t;
    这个关键字,你自己百度一下就明白了。
    并不是返回了单独的T

    那linq扩展了IEnumerable<T>,但肯定有一个class继承了IEnumerable<T>才行,然后发现 
    string[] arrStr = { "a", "b", "c" };
    然后这个的数组Array类型,
    ,没发现有继承IEnumerable<T>接口的,这就是疑问的地方
      

  10.   

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generics-and-arrays自己看官方说明
      

  11.   

    这里IEnumerable<T>是因为Array类继承的IEnumerable吗
    首先,泛型和非泛型,不一样。
    我们先看一下 List。它同时需要实现IEnumerable和IEnumerable<T>我们在仔细看一下IEnumerable<T>,发现它也要继承自IEnumerable
    所以结论其实很简单,IEnumerable<T>和IEnumerable就是两个类,不一样。
    然后我们稍微说一下,为什么List需要实现IEnumerable<T>和IEnumerable,但是IEnumerable<T>本来就需要实现IEnumerable,这样是重复的。
    这个问题,看过蛮多答案的。后来感觉可能由于微软为了方便代码阅读吧。2 返回T类型转为基类形,有什么作用
    你要看一下是yield return t;
    这个关键字,你自己百度一下就明白了。
    并不是返回了单独的T

    问题就是 string[] arrStr 数组类型没看到继承IEnumerable<T>,即使IEnumerable<T>接口再扩展又有什么用
    f12看到的array类的定义是没有IEnumerable<T>的继承,请问数组类型是怎么和IEnumerable<T>关联的
      

  12.   

    是说 单维数组自动实现IList <T>,又
    public interface IList<T> : System.Collections.Generic.ICollection<T>, System.Collections.Generic.IEnumerable<T>
    所以数组也就继承了IEnumerable<T>,  是吗?
      

  13.   


    System.Linq.Enumerable类,提供了数十种称为扩展方法的共享方法,帮助您操作所有实现IEnumerable(of T)接口的类中的数据。由于Enumerable类的扩展方法可以处理许多其他类如(包括Array和List),因此不仅可以使用Enumerable类的方法来创建LINQ查询,还可以用它来操作数组和其他数据结构的行为。
    https://www.cnblogs.com/RealAlex/p/3182820.html
    https://stackoverflow.com/questions/33117732/ienumerable-count-or-tolist-count
      

  14.   

    因为没看到 |Array类中继承IEnumerable<T>接口,而System.Linq是对IEnumerable<T>的扩展,然后它怎么就影响到Array了
      

  15.   

    ??? 一个帖子引出这么多内容。Linq 里大部分都是附加方法。
      

  16.   

    版主回来再看一眼吧
    方法也是可以有泛型的。
    而且 array是数组的基类,string[]是一个派生类。
    string拥有更多的扩展
      

  17.   

    你调用的是Enumerable类中的这个泛型方法public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);你写的代码arrStr.Count(p=>p==str);完整的写法应该是arrStr.Count<string>(p=>p==str);因为编辑器可以推断出你要传递的类型,所以才可以像你上面那样写,不写string。
    泛型其实就是为了减少代码的重复性而出现的。泛型使得你定义一个其他类型数组也能调用count()方法。
      

  18.   

    这个问题已经不是开头问题了,是开头问题引出的问题
    你的回答我明白.
    现在问题,是string[]类型中没发现有继承了IEnumerable<T>接口的语句,然而他却能调用linq扩展IEnumerable<T>接口的方法,为什么?
      

  19.   

    哎,又是一个准备学4年的。都不知道你到底纠结了什么???
    你自己贴的public abstract class Array请问abstract 何意啊。纠结,纠结。你纠结这些有啥用
      

  20.   

    myclass[]  xxxx=new myclass[]请问你继承了Array?????????????
    很明显我没继承myclass没有继承array,这表明是编译器给你做的,这就是典型的人是人,机器是机器。编辑器编译给机器看的,他告诉机器他继承了array,同时他编译的同时把Ilist<T>以前实现了,但是人根本别纠结,他本来就不是给你看的,他就是一个迫不得已的给机器看的玩意。所以还是那句话,这么学法不对。就像最早的英语教学一样,“主谓宾定状补,啥完成时,过去时”你从初中学到大学毕业,近10年时间,都都赶不上一个桂林卖小吃的老太太,所以不是你不努力,而是方法错误。
      

  21.   

    我觉得真心没必要纠结这个玩意,首先string[]既不是ArrayList类型,也不是List<string>类型。至于这个微软内部怎么实现的,没必要知道啊。但是通过他可以调用Count()方法就可以看出,他实现了IEnumerable<T> 这个接口的。因为只有一个对象实现了这个接口,你才能通过linq的方式去调用Count()方法;就好像List<string> list = new List<string>();只要list能调用linq中的Count()方法,就知道它肯定是实现了IEnumerable<T>这个接口的。就好像Console.WriteLine()可以在控制台打印一样。为什么能在你电脑上打印出来东西啊。如果要研究透这个东东,那要学的东西太多了,我们只要知道这样做可以打印就行了。
      

  22.   

    其实看c++/cli就知道了
    string[]在c++/cli里其实是Array<String^> ^
    也就是说.net里是有泛型数组这个类型,但是通过语法糖隐藏起来了
    int[] 其实就是Array<int>,这个是实现了IEnumerable<int>的
      

  23.   

    啊,现在搞得这么复杂了。enum 使用迭代么?
      

  24.   

    linq扩展了IEnumerable<T>,有一个class继承了IEnumerable<T>才行,发现 
    string[] arrStr = { "a", "b", "c" };
    然后这个的数组Array类型,
      

  25.   

    大哥说的这些我不赞同了,一门语言定义的一些关键字,接口等可以成为规则,至于规则的原因(比如为什么要这样之类的定义)你可以不细究,但别人在用这套已有的规则写成了一个功能,但你却却看不出来用了什么,这就需要你反思自己熟悉的那套规则了,别人居然还能脱了规则做事,要么是自己已知的规则不完善,要么他这是个错误做法
    问题中 count明明扩展的是IEnumerable<T>这个接口,而string[] 这个类型是 看不到,找不到  哪里有继承这样的接口的
    你说说看 一个类型没有继承一个接口,居然能调用这个接口中的方法,这是什么了??
      

  26.   

    这个问题中也只有#33说的,与问题解决相关,大CSDN的那么多人,这个小问题,都不能说清吗
      

  27.   

    这个问题中也只有#33说的,与问题解决相关,大CSDN的那么多人,这个小问题,都不能说清吗我觉得真心没必要纠结这个玩意,首先string[]既不是ArrayList类型,也不是List<string>类型。至于这个微软内部怎么实现的,没必要知道啊。但是通过他可以调用Count()方法就可以看出,他实现了IEnumerable<T> 这个接口的。因为只有一个对象实现了这个接口,你才能通过linq的方式去调用Count()方法;就好像List<string> list = new List<string>();只要list能调用linq中的Count()方法,就知道它肯定是实现了IEnumerable<T>这个接口的。就好像Console.WriteLine()可以在控制台打印一样。为什么能在你电脑上打印出来东西啊。如果要研究透这个东东,那要学的东西太多了,我们只要知道这样做可以打印就行了。
    我想知道在哪里实现的,难道是被隐藏了?
      

  28.   

    没有万一,按规则做事。万一当年赫鲁晓夫没有发疯砍了那项目,也许现在用三进制编程。额,在纠结一下,额,我有10个手指头,为啥用3进制?多小的问题啊,多核心的问题啊,万一你弄明白了,你也许是下个IBM的创始人
      

  29.   

    GetEnumerator 足矣。