C#使用LINQ中Enumerable类方法的延迟与立即执行的控制

2019-12-30 11:42:49王旭

程序运行结果如下:

C#使用LINQ中Enumerable类方法的延迟与立即执行的控制

没有显示完全,后面一组输出和上面最后一组相同(只是使用了自定义的比较器)。

 5.SequenceEqual 比较两个序列是否相等


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SequenceEqual
{
  /// <summary>
  /// 
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      //5.SequenceEqual 比较两个序列是否相等 
      //a比较两个序列
      string[] names1 ={ "DebugLZQ","Sarah","Jerry","Jeffrey","M&M"};
      List<string> names2 = new List<string> { "DebugLZQ", "Sarah", "Jerry", "Jeffrey", "M&M" };
      bool equalornot = names1.SequenceEqual(names2);
      bool equalornot2 = names1.Skip(3).Take(2).SequenceEqual(names2.Take(3).SkipWhile(n=>n.Length==3));
      Console.WriteLine("{0},{1}",equalornot,equalornot2 );
      Console.WriteLine("----------------------------");
      Console.ReadKey();
      //b自定义比较器
      bool equalornot3 = names1.SequenceEqual(names2, new MyEqualityComparer<string>(names2.ToArray()));
      Console.WriteLine("{0}",equalornot3);
      Console.ReadKey();
    }
  }
}

自定义的比较器如下:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SequenceEqual
{
  //DebugLZQ提示:
  //如不知道具体的接口实现
  //可以用vs提供的自动实现接口功能实现这个接口
  class MyEqualityComparer<T> : IEqualityComparer<T>
  {
    private string[] sec;
    public MyEqualityComparer(string[] s)
    {
      sec = s;
    }
    #region IEqualityComparer<T> 成员

    public bool Equals(T x, T y)
    {
      string temp = x as string;
      if (x != null)
      {
        return sec.Contains(temp);
      }
      return false;
    }

    public int GetHashCode(T obj)
    {
      return obj.GetHashCode();
    }

    #endregion
  }
}

可以使用VS自动实现接口的智能提示,完成接口的实现。
接口的实现方式有“实现接口”和“显式实现接口”之分,上面这种实现方式即“显示接口”方式,“显示实现接口”最显著的特征是实现的接口方法加了个完全限定名,这样显式实现之后,无法通过具体的类名来访问接口方法,只能通过接口名来访问,这样可以隐藏类的复杂性。