C\#LINQ 에서 Enumerable 클래스 를 사용 하 는 지연 및 즉시 실행 제어

32156 단어 LINQC#
시간 지연 실행 Enumerable 클래스 방법
LINQ 표준 조회 연산 법 은 확장 방법 에 의 해 이 루어 진다.이러한 확장 방법 은 각각 System.Linq.Enumerable 과 System.Linq.Queryable 이라는 정적 클래스 에서 정 의 됩 니 다.
Enumerable 의 확장 방법 은 선형 절 차 를 사용 하고 모든 연산 법 은 선형 으로 실 행 됩 니 다.이러한 실행 방법 은 유사 관계 형 데이터베이스 데이터 원본 을 조작 하면 효율 이 매우 떨 어 지기 때문에 Queryable 은 이러한 확장 방법 을 다시 정의 하고 LINQ 표현 식 을 표현 식 트 리 로 분해 하여 프로그램 을 제공 하면 표현 식 트 리 에 따라 관계 형 데이터 베 이 스 를 생 성 하 는 검색 어,즉 SQL 명령 을 한 다음 에 관련 작업 을 할 수 있 습 니 다.
모든 조회 연산 자의 실행 행 위 는 다 르 며,크게 즉시 실행 과 지연 으로 나 뉜 다.시간 을 끌 어 실행 하 는 연산 자 는 요 소 를 매 거 할 때 실 행 됩 니 다.
Enumerable 클래스 는 프로그램 집합 System.Core.dll 에 위치 하고 System.Linq 네 임 스페이스 에 있 으 며 System.Object 에 직접 통합 되 어 3.5 이상 의.NET 프레임 워 크 에 존재 합 니 다.Enumerable 은 정적 클래스 로 예화 되 거나 계승 되 지 않 으 며 구성원 은 정적 및 확장 방법 만 있 습 니 다.
LINQ 는 IEnumerable또는 IQueryable를 실현 하 는 유형 을 조회 할 수 있 을 뿐만 아니 라 IEnumerable 인 터 페 이 스 를 실현 하 는 유형 도 조회 할 수 있 습 니 다.
LINQ 를 이해 하려 면 우선 확장 방법 을 이해 해 야 합 니 다.
msdn 은 이렇게 확장 방법 을 규정 합 니 다."확장 방법 은 정적 방법 으로 정의 되 지만 인 스 턴 스 방법 문법 을 통 해 호출 됩 니 다."그들의 첫 번 째 매개 변 수 는 이 방법 이 어떤 유형 에 작용 하 는 지 지정 하고 이 매개 변 수 는 this 수식 자 를 접두사 로 합 니 다.
다음 확장 방법의 예 는 다음 과 같다.

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

namespace     
{
  /// <summary>
  ///  string          
  /// </summary>
  static class Helper
  { 
    public static string MyExtenMethod(this string s)
    {
      return s.Substring(0, 2);
    }
  }
  class Program
  {
    static void Main(string[] args)
    {
      string s = "      ";
      Console.WriteLine(s.MyExtenMethod());//  
      Console.ReadKey(false);
    }
  }
}

프로그램의 실행 결 과 는 다음 과 같다.
201637145206299.png (677×442)
이해 와 기억 을 위해 자주 사용 하 는 지연 실행 방법 인 Enumerable 클래스 의 멤버 를 다음 그룹 으로 나 누 었 습 니 다.구체 적 으로 다음 과 같 습 니 다.
1.Take 는 한 시퀀스 의 시작 에서 지정 한 수량의 요 소 를 되 돌려 줍 니 다.
2.TakeWhile 은 조건 에 맞지 않 는 요 소 를 만 날 때 까지 지 정 된 시퀀스 를 처음부터 조건 에 맞 는 요 소 를 가 져 오 는 데 사 용 됩 니 다.
3.건 너 뛰 기 시퀀스 에서 지정 한 수량의 요소
4.SkipWhile 은 시퀀스 가 조건 을 만족 시 키 는 요 소 를 건 너 뛰 는 데 사 용 됩 니 다.나머지 요 소 를 되 돌려 줍 니 다.

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

namespace      Enumerable   
{
  class Program
  {
    static void Main(string[] args)
    {
      string[] names = { "DebugLZQ","DebugMan","Sarah","Jerry","Tom","Linda","M&M","Jeffery"};
      //1.Take                   
      //
      //a.        Take  
      foreach (string name in names.Take(3))
      {
        Console.Write("{0}  ", name); 
      }
      Console.WriteLine();
      Console.WriteLine("-----");
      //b. LINQ   IEnumerable<T>     Take  
      var query = from string name in names
            where name.Length <=3
            select name;
      foreach (string name in query.Take(1))
      {
        Console.Write("{0}  ",name);
      }
      Console.WriteLine();
      Console.WriteLine("----------------------------");
      Console.ReadKey(false);
      //2.TakeWhile                    ,              
      //
      var takenames = names.TakeWhile(n => n.Length>4);
      var takenames2 = names.TakeWhile((n,i)=>n.Length<10&&i<3);
      foreach (string name in takenames)
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("-----");
      foreach (string name in takenames2)
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("----------------------------");
      Console.ReadKey(false);
      //3.Skip            
      //
      foreach (string name in names.Skip(5))
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("-----");
      var query_skip = (from name in names
               where name.Length >= 3
               select name).Skip(2);
      foreach (string name in query_skip.Skip(2) )
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("----------------------------");
      Console.ReadKey(false);
      //4.SkipWhile               ,         
      //        3 
      var takenames_SkipWhile = names.SkipWhile(n => n.Length >3);
      foreach (string name in takenames_SkipWhile)
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("-----");
      var takenames_SkipWhile2 = names.SkipWhile((n,i)=>n.Length>3&&i>2);
      foreach (string name in takenames_SkipWhile2)
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("----------------------------");
      Console.ReadKey(false);

      //  Take、Skip   N  M   
      var names_TakeAndSkip = names.Skip(5).Take(3);

      var names_TakeAndSkip2 = (from name in names
                   select name).Skip(5).Take(3);

      foreach (string name in names_TakeAndSkip)
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("-----");
      foreach (string name in names_TakeAndSkip2)
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("----------------------------");
      Console.ReadKey(false);

    }
  }
}

프로그램 에 자세 한 설명 이 있 습 니 다.더 이상 설명 하지 않 습 니 다.프로그램 실행 결 과 는 다음 과 같 습 니 다.
201637145251348.png (677×442)
5.Reverse 는 시퀀스 의 요 소 를 뒤 집 는 순서 에 사 용 됩 니 다.
6.Distinct 중복 요 소 를 걸 러 냅 니 다.

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

namespace Reverse_Distinct 
{
  class Program
  {
    static void Main(string[] args)
    {
      string[] names = { "DebugLZQ", "Jerry", "Sarah", "Jerry", "Tom", "Linda", "M&M", "Jeffery" };
      //5.Reverse             
      string str = "     ";

      var strre = str.ToCharArray().Reverse();
      var takenames = names.Reverse();

      foreach (var c in strre)
      {
        Console.Write(c);
      }
      Console.WriteLine();
      Console.WriteLine("-----");
      foreach (var c in takenames )
      {
        Console.WriteLine(c);
      }
      Console.WriteLine("----------------------------");
      Console.ReadKey(false);

      //6.Distinct         
      var takenames_Distinct = names.Distinct();

      foreach (var c in takenames_Distinct)
      {
        Console.WriteLine(c);
      }
      Console.WriteLine("----------------------------");
      Console.ReadKey(false);
    }
  }
}

프로그램의 실행 결 과 는 다음 과 같다.
201637145330291.png (677×442)
7.Union 은 두 서열 을 합 쳐 중복 항목 을 제거 하 는 데 사용 된다.
8.Concat 는 두 시퀀스 를 연결 하 는 데 사용 되 며 중복 항목 을 제거 하지 않 습 니 다.
9.Intersect 는 연 결 된 서열 의 교 집합 을 얻 는 데 사용 된다.
10.Except 는 두 개의 결 합 된 차 집합 을 얻 는 데 사 용 됩 니 다.

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

namespace Union_Concat_Intersect_Except
{
  /// <summary>
  /// DebugLZQ
  /// http://www.cnblogs.com/DebugLZQ
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      string[] names1 = { "DebugLZQ", "Jerry", "Sarah", "Jerry", "Tom", "Linda", "M&M", "Jeffery" };
      string[] names2 = { "DebugLZQ", "Jerry", "Sarah" };

      //7.Union        ,      
      var names_Union = names1.Union(names2);

      //8.Concat        ,       
      var names_Concat = names1.Concat(names2);

      //9.Intersect           
      var names_Intersect = names1.Intersect(names2);

      //10.Except           
      var names_Except = names1.Except(names2);

      foreach (string name in names_Union)
      {
        Console.WriteLine(name);
      }
      Console.WriteLine("-----");
      Console.ReadKey(false);
      foreach (string name in names_Concat)
      {
        Console.WriteLine(name);
      }
      Console.WriteLine("-----");
      Console.ReadKey(false);
      foreach (string name in names_Intersect)
      {
        Console.WriteLine(name);
      }
      Console.WriteLine("-----");
      Console.ReadKey(false);
      foreach (string name in names_Except)
      {
        Console.WriteLine(name);
      }
      Console.WriteLine("-----");
      Console.ReadKey(false);
    }
  }
}

프로그램의 실행 결 과 는 다음 과 같다.
201637145400103.png (677×442)
11.Range 는 지 정 된 범위 내의'정수'시퀀스 를 생 성 하 는 데 사 용 됩 니 다.
12.Repeat 는 지 정 된 수량의 중복 요 소 를 생 성 하 는 데 사 용 됩 니 다.
13.Empty 는 지정 한 형식의 빈 시퀀스 를 얻 는 데 사 용 됩 니 다.
14.DefaultIfEmpty 는 시퀀스 를 얻 는 데 사 용 됩 니 다.비어 있 으 면 기본 형식 요 소 를 추가 합 니 다.

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

namespace Range_Empty_DefalultIfEmpty
{
  /// <summary>
  /// DebugLZQ
  /// http://www.cnblogs.com/DebugLZQ
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      //11.Range           “  ”  
      var num2 = Enumerable.Range(10, 15);

      //12.Repeat             
      var guest = new {Name="  ",Age=25 };
      var Guests = Enumerable.Repeat(guest, 5);

      //13.Empty               
      var empty = Enumerable.Empty<string>();

      //14.DefaultIfEmpty       ,    ,           
      //a
      var intempty = Enumerable.Empty<int>();
      Console.WriteLine(intempty.Count());
      Console.WriteLine("-----------");
      foreach (var n in intempty)
      {
        Console.WriteLine(n);      
      }
      Console.WriteLine("-----------");
      Console.WriteLine(intempty.DefaultIfEmpty().Count());
      Console.WriteLine("-----------");
      foreach (var n in intempty.DefaultIfEmpty())
      {
        Console.WriteLine(n);
      }
      Console.WriteLine("--------------------------");
      Console.ReadKey(false);
      //b
      string[] names = { "DebugLZQ", "DebugMan", "Sarah", "Jerry", "Tom", "Linda", "M&M", "Jeffery" };
      var query = from name in names
            where name == "LBJ"
            select name;
      Console.WriteLine(query.Count());
      Console.WriteLine(query.DefaultIfEmpty().Count());//   null
      foreach (var n in query.DefaultIfEmpty())
      {
        Console.WriteLine(n);
      }
      Console.WriteLine("---------------");
      Console.ReadKey(false);
      //c       
      foreach (var n in intempty.DefaultIfEmpty(100))
      {
        Console.WriteLine(n);
      }
      Console.WriteLine("--------------------------");
      Console.ReadKey(false);

      foreach (var n in query.DefaultIfEmpty("James"))
      {
        Console.WriteLine(n);
      }
      Console.ReadKey(false);
    }
  }
}

프로그램의 실행 결 과 는 다음 과 같다.
201637145430004.png (677×442)
15.OfType 에서 지정 한 형식의 요 소 를 선별 합 니 다.
16.캐 스 트 유형 변환
17.AsEnumerable 일부 데이터 원본 형식 은 Enumerable 의 일부 검색 키 워드 를 지원 하지 않 습 니 다.예 를 들 어 IQueryable 과 같은 변환 이 필요 합 니 다.

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

namespace Cast_OfType_AsEnumerable
{
  /// <summary>
  /// DebugLZQ
  /// http://www.cnblogs.com/DebugLZQ
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      ArrayList names = new ArrayList();
      names.Add("DebugLZQ");
      names.Add("Jerry");
      names.Add(100);
      names.Add(new {Name="LZQ",Age=26});
      names.Add(new Stack());
      //15.OfType         
      var takenames = names.OfType<string>();

      //16.Cast    
      var takenames2 = names.OfType<string>().Cast<string>();

      //17.AsEnumerable
      var takenames3 = takenames2.AsEnumerable();

      foreach (var name in takenames3)
      {
        Console.Write("{0} ",name);
      }
      Console.ReadKey(false);

    }
  }
}

프로그램 실행 결 과 는 다음 과 같 습 니 다.
201637145459775.png (677×442)
지연 실행 은 말 그대로 바로 실행 되 는 것 이 아 닙 니 다.즉,검색 어 정의 때 실행 되 는 것 이 아니 라 처리 결과 집(예 를 들 어 옮 겨 다 니 는 것)때 실 행 됩 니 다.Enumerable 류 방법 구성원 중에서 이 절 에서 자주 사용 하 는 17 개 를 제외 하고 앞의 박문-LINQ 기본 자구 에서 총 결 된 8 개의 기본 자구 도 모두 지연 되 어 실 행 됩 니 다.지연 되 는 조회 프로그램의 실행 절 차 를 주의 하 십시오.
즉시 실행 되 는 Enumerable 클래스 방법
다음 에 자주 사용 하 는 즉시 실행 되 는 Enumerable 류 방법 과 그들의 상용 용법 을 정리 하 겠 습 니 다.마찬가지 로 이해 와 기억 에 편리 하도록 조 를 나 누 어 보 자.
1.ToArray 시퀀스 를 배열 로 변환
2.ToList 시퀀스 를 List로 변환

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

namespace      Enumerable     
{
  class Program
  {
    static void Main(string[] args)
    {
      //1.ToArray       
      List<string> names =new List<string> { "DebugLZQ","Sarah","Jerry","Jeffrey","M&M"};
      string[] takenames = names.ToArray();

      string[] takenames2 = (from name in names
                 where name.IndexOf("Je")>-1
                 select name).ToArray();

      //2.ToList     List<T>
      string[] namesA = { "DebugLZQ", "Sarah", "Jerry", "Jeffrey", "M&M" };
      List<string> takenames_ToList = namesA.ToList();
      List<string> takenames_ToList2 = (from name in namesA select name).ToList();

      //
    }
  }
}

프로그램 결과 가 뻔 하기 때문에 출력 문 구 를 쓰 지 않 았 습 니 다.
3.ToDictionary 는 시퀀스 를 범용 Dictionary로 변환 합 니 다.
4.ToLookup 은 시퀀스 를 범용 Lookup로 변환 하 는 데 사 용 됩 니 다.
Dictionary 와 Lookup 은 매우 비슷 한 유형 으로 모두'키'를 통 해 관련 요 소 를 방문 합 니 다.다른 것 은 Dictionary 의 Key 와 Value 는 일일이 대응 하 는 관계 이 고 Lookup 의 Key 와 Value 는 한 쌍 의 다 중 관계 입 니 다.Lookup 은 공공 구조 함수 가 없 을 때 ToLookup 으로 구축 할 수 있 고 생 성 후에 도 Lookup 의 요 소 를 삭제 할 수 없습니다.

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

namespace ToDictionary
{
  /// <summary>
  /// 3.ToDictionary        Dictionary<TKey,TValue>
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      List<GuestInfo> gList = new List<GuestInfo>() 
      {
        new GuestInfo(){Name="Jeffrey", Age=33,Tel="136********"},
        new GuestInfo(){ Name="DebugLZQ", Age=25,Tel="187********"},
        new GuestInfo(){Name="Sarah", Age=24,Tel="159********"},
        new GuestInfo(){Name="Jerry", Age=33,Tel="135********"},
        new GuestInfo(){Name="Smith", Age=33,Tel="139********"}        
      };
      //ToDictionary        Dictionary
      //ToDictionary   4   
      //a. Name  Dictionary “ ”,guest “value”
      Dictionary<string, GuestInfo> dictionary1 = gList.ToDictionary(guest => guest.Name);
      foreach (var s in dictionary1 )
      {
        Console.WriteLine("  {0}:{1} {2} {3}",s.Key,s.Value.Name,s.Value.Age,s.Value.Tel );
      }
      Console.WriteLine("--------------------------------");
      Console.ReadKey();
      //b.            
      Dictionary<string,GuestInfo> dictionary2=gList.ToDictionary(guest=>guest.Name,new MyEqualityComparer<string>());
      foreach (var s in dictionary2)
      {
        Console.WriteLine("  {0}:{1} {2} {3}", s.Key, s.Value.Name, s.Value.Age, s.Value.Tel);
      }
      Console.WriteLine("--------------------------------");
      Console.ReadKey();
      //c. Name  Dictionary “ ”,Tel   "value"
      Dictionary<string, string> dictionary3 = gList.ToDictionary(guest=>guest.Name,g=>g.Tel);
      foreach (var s in dictionary3)
      {
        Console.WriteLine("  {0}:{1}", s.Key, s.Value);
      }
      Console.WriteLine("--------------------------------");
      Console.ReadKey();
      //d.      
      Dictionary<string, string> dictionary4 = gList.ToDictionary(guest=>guest.Name,g=>g.Tel,new MyEqualityComparer<string>());
      foreach (var s in dictionary4)
      {
        Console.WriteLine("  {0}:{1}", s.Key, s.Value);
      }
      Console.WriteLine("------------------------------------------------------");
      Console.ReadKey();


      ///////////////
      ///4.ToLookup          Lookup<TKey,TValue>。
      ///Dictionary Lookup          ,   “ ”       ,    Dictionary Key Value       
      ///Lookup Key Value      
      ///Lookup        ,   ToLookup  ,        Lookup    。
      ///     4   ,    ToDictionary  
      ///
      //a. Name      (   ) key
      ILookup<string, GuestInfo> lookup1 = gList.ToLookup(guest => guest.Name.Substring(0, 1));
      foreach (var k in lookup1)
      {
        Console.WriteLine(k.Key);//  
        foreach (var v in k)
        {
          Console.Write("{0},{1},{2}",v.Name,v.Age,v.Tel );
        }
        Console.WriteLine();
      }
      Console.WriteLine("--------------------------------");
      Console.ReadKey();
      //b      
      ILookup<string, GuestInfo> lookup2 = gList.ToLookup(guest => guest.Name.Substring(0, 1), new MyEqualityComparer<string>());
      foreach (var k in lookup2)
      {
        Console.WriteLine(k.Key);//  
        foreach (var v in k)
        {
          Console.Write("{0},{1},{2}", v.Name, v.Age, v.Tel);
        }
        Console.WriteLine();
      }
      Console.WriteLine("--------------------------------");
      Console.ReadKey();
      //c
      ILookup<string, string> lookup3 = gList.ToLookup(guest=>guest.Name.Substring(0,1),g=>g.Name );
      foreach (var k in lookup3)
      {
        Console.WriteLine(k.Key);//  
        foreach (var v in k)
        {
          Console.Write("{0} ", v);
        }
        Console.WriteLine();
      }
      Console.WriteLine("--------------------------------");
      Console.ReadKey();
      //d      
      ILookup<string, string> lookup4 = gList.ToLookup(guest=>guest.Name.Substring(0,1),g=>g.Name,new MyEqualityComparer<string>());
      foreach (var k in lookup4)
      {
        Console.WriteLine(k.Key);//  
        foreach (var v in k)
        {
          Console.Write("{0} ", v);
        }
        Console.WriteLine();
      }
      Console.WriteLine("--------------------------------");
      Console.ReadKey();
    }
  }
}

프로그램 실행 결 과 는 다음 과 같 습 니 다.
201637145545266.png (669×754)
완전히 표시 되 지 않 았 습 니 다.뒤의 출력 은 위의 마지막 그룹 과 같 습 니 다.(사용자 정의 비교 기 만 사 용 했 습 니 다.)
 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 를 사용 하여 인터페이스의 스마트 힌트 를 자동 으로 실현 하고 인터페이스의 실현 을 완성 할 수 있다.
인터페이스의 실현 방식 은'실현 인터페이스'와'현식 실현 인터페이스'의 구분 이 있다.위의 이러한 실현 방식 은 바로'디 스 플레이 인터페이스'방식 이다.'디 스 플레이 실현 인터페이스'의 가장 현저 한 특징 은 실 현 된 인터페이스 방법 에 완전한 한정 명 을 추가 하 는 것 이다.이렇게 현식 이 실 현 된 후에 구체 적 인 유형 명 을 통 해 인터페이스 방법 에 접근 할 수 없고 인터페이스 명 을 통 해 만 접근 할 수 있다.이렇게 하면 종류의 복잡성 을 숨 길 수 있다.
프로그램 실행 결 과 는 다음 과 같 습 니 다.
201637145630906.png (677×138)
6.First 반환 시퀀스 첫 번 째 만족 조건 요소
7.First OrDefault 는 첫 번 째 만족 조건 요 소 를 되 돌려 줍 니 다.찾 지 못 하면 기본 값 을 되 돌려 줍 니 다.
8.Last
9.LastOrDefault
10.Single 반환 시퀀스 의 유일한 요 소 는 시퀀스 에 여러 요 소 를 포함 하면 실행 오류 가 발생 할 수 있 습 니 다!
11.SingleOrDefault 는 시퀀스 에 일정한 조건 을 만족 시 키 는 요 소 를 찾 습 니 다.시퀀스 가 비어 있 으 면 기본 값 을 되 돌려 줍 니 다.시퀀스 에 여러 개의 요소 가 포함 되 어 있 으 면 실행 오류 가 발생 합 니 다!
12.Element At 에서 지정 한 색인 에 있 는 요 소 를 가 져 옵 니 다.
13.Element AtOrDefault 는 지정 한 색인 에 있 는 요 소 를 가 져 옵 니 다.색인 을 초과 하면 요소 형식의 기본 값 을 되 돌려 줍 니 다.

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

namespace First_FirstOrDefault_Last_LastOrDefault_ElementAt_ElementAtOrDefaul
{
  class Program
  {
    static void Main(string[] args)
    {
      //6.First
      string[] names = { "DebugLZQ", "Sarah", "Jerry", "Jeffrey", "M&M" };
      var item = names.First();
      var item2 = names.First(n => n == "Sarah");
      Console.WriteLine("{0},{1}",item,item2 );
      Console.ReadKey();
      //7.FirstOrDefault
      var item3 = names.FirstOrDefault();
      var item4 = names.FirstOrDefault(n => n == "Sarah");
      Console.WriteLine("{0},{1}", item3, item4);
      Console.ReadKey();
      //8.Last
      var item5 = names.Last();
      var item6 = names.LastOrDefault(n => n == "Sarah");
      Console.WriteLine("{0},{1}", item5, item6);
      Console.ReadKey();
      //9LastOrDefault
      var item7 = names.LastOrDefault();
      var item8 = names.LastOrDefault(n => n == "Sarah");
      Console.WriteLine("{0},{1}", item7, item8);
      Console.ReadKey();
      //10.Single          ,           ,       !
      try
      {
        var item9 = names.Single();
      }
      catch(Exception ex)
      {
        Console.WriteLine(ex.Message);
      }
      //
      var item10 = names.Single(n => n == "Sarah");
      Console.WriteLine("{0}",item10 );
      Console.ReadKey();
      //11.SingleOrDefault               ,            ,                     !!
      try
      {
        var item11 = Enumerable.Empty<string>().SingleOrDefault();
        Console.WriteLine("{0}",item11);//   ,             
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.Message );
      }
      try
      {
        var item12 = names.SingleOrDefault();
        Console.WriteLine("{0}", item12);//  ,        
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.Message);
      }
      var item13 = Enumerable.Empty<string>().DefaultIfEmpty("DebugLZQ").SingleOrDefault();
      Console.WriteLine("{0}", item13);
      var item14 = names.SingleOrDefault(n => n == "xxx");
      Console.WriteLine("{0}", item14);
      Console.ReadKey();
      //12ElementAt           
      var item15 = names.ElementAt(3);
      Console.WriteLine("{0}", item15);
      Console.ReadKey();
      //13ElementAtOrDefault           ,      ,           
      var item16 = names.ElementAtOrDefault(3);
      var item17 = names.ElementAtOrDefault(100);
      Console.WriteLine("{0},{1}",item16,item17);
      Console.ReadKey();
    }
  }
}

프로그램 실행 결 과 는 다음 과 같 습 니 다.
201637145709767.png (677×266)
14.All 시퀀스 의 모든 요소 가 조건 을 만족 시 키 는 지 여부
15.Any 시퀀스 의 요소 가 존재 하거나 조건 을 만족 시 키 는 지 여부
16.Contains 요소 가 시퀀스 에 있 는 지 확인
17.Count 시퀀스 에 포 함 된 요소 의 수량
18.LongCount 에서 Int 64 유형의 요 소 를 가 져 옵 니 다.
19.Aggregate 는 시퀀스 요 소 를 누적 합 니 다.
20.Sum 서열 의 합
21.Average 시퀀스 평균 값
22.Min 시퀀스 의 최소 값
23.Max 시퀀스 의 최대 값

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

namespace All_Any_Count_LongCount_Aggregate_SumAverage_Min_Max
{
  class Program
  {
    static void Main(string[] args)
    {
      string[] names = { "DebugLZQ", "Sarah", "Jerry", "Jeffrey", "M&M" };
      //14All               
      bool b1 = names.All(s=>s.GetTypeCode()==TypeCode.String );
      bool b2 = names.All(s=>s.IndexOf("S")>-1);
      Console.WriteLine("{0},{1}",b1,b2);
      Console.ReadKey();
      Console.WriteLine("----------------------");
      //15Any               
      bool p1 = names.Any();
      bool p2 = names.Any(s => s.IndexOf("S")>-1);
      Console.WriteLine("{0},{1}", p1, p2);
      Console.ReadKey();
      Console.WriteLine("----------------------");
      //16Contains          
      //a
      bool q1 = names.Contains("MM");
      //b       
      bool q2 = names.Contains("MM", new MyEqualityComparer<string>());
      Console.WriteLine("{0},{1}", q1, q2);
      Console.ReadKey();
      Console.WriteLine("----------------------");
      //17Count         
      int i1 = names.Count();
      int i2 = names.Count(n => n.Length == 5);
      Console.WriteLine("{0},{1}", i1, i2);
      Console.ReadKey();
      Console.WriteLine("----------------------");
      //18LongCount    Int64       
      long j1 = names.LongCount();
      long j2 = names.LongCount(n => n.Length == 5);
      Console.WriteLine("{0},{1}",j1, j2);
      Console.ReadKey();
      Console.WriteLine("----------------------");
      //19Aggregate         
      int[] nums = { 10,20,30,40,50};
      int a1 = nums.Aggregate((n1,n2)=>n1+n2);//150
      int a2 = nums.Aggregate(50,(n1,n2)=>n1+n2);//200      
      Console.WriteLine("{0},{1}", a1, a2);
      string s1 = names.Aggregate((name1,name2)=>string.Format("{0}、{1}",name1,name2));
      string s2= names.Aggregate("The result is ",(name1, name2) => string.Format("{0}、{1}", name1, name2));
      Console.WriteLine("{0}", s1); 
      Console.WriteLine("{0}", s2);
      Console.ReadKey();
      Console.WriteLine("----------------------");
      //20Sum    
      int sum = nums.Sum();
      //21Average     
      double avg = nums.Average();
      //22Min      
      int min = nums.Min();
      //23Max      
      int max=nums.Max();
      Console.WriteLine("{0},{1},{2},{3}", sum, avg,min,max);
      Console.ReadKey();
      
    }
  }
}

프로그램 실행 결 과 는 다음 과 같 습 니 다.
201637145734802.png (677×442)

좋은 웹페이지 즐겨찾기