次の方法で共有


LINQ: .NET Language-Integrated クエリ


 

Don BoxAnders Hejlsberg

2007 2

:
   Visual Studio Code  "Orcas"
   .NET Framework 3.5

.NET Framework  XML  .NET Language-Integrated  (LINQ)  (32)


.NET Language-Integrated 
使
LINQ 


LINQ to SQL: SQL 
LINQ to XML: XML 

.NET Language-Integrated 


20 (OO)     OO使 OO2  XML 

LINQ  XML  XML .NET Framework .NET Language-Integrated  (LINQ) 

使 (Visual C#Visual Basic )  使  使IntelliSense  

.NET Language-Integrated    NET  使  IEnumerable<T>  LINQ 使  使   LINQ 

 LINQ 使XML  SQL  XML (LINQ to XML) 使 XML 使  XPath/XQuery    (LINQ to SQL) SQL  (CLR)    

使


使 C# 3.0 
using System;
using System.Linq;
using System.Collections.Generic;

class app {
  static void Main() {
    string[] names = { "Burke", "Connor", "Frank", 
                       "Everett", "Albert", "George", 
                       "Harris", "David" };

    IEnumerable<string> query = from s in names 
                               where s.Length == 5
                               orderby s
                               select s.ToUpper();

    foreach (string item in query)
      Console.WriteLine(item);
  }
}


BURKE
DAVID
FRANK
To understand how language-integrated query works, we need to dissect the
 first statement of our program.
IEnumerable<string> query = from s in names 
                           where s.Length == 5
                           orderby s
                           select s.ToUpper();

 11 3 (Where OrderBy Select) 使

Visual Basic 9.0  LINQ  Visual Basic 9.0 
Dim query As IEnumerable(Of String) = From s in names _
                                     Where s.Length = 5 _
                   Order By s _
                   Select s.ToUpper()

 C#  Visual Basic 使 foreach 便 C# 
IEnumerable<string> query = names 
                            .Where(s => s.Length == 5) 
                            .OrderBy(s =>s)
                            .Select(s => s.ToUpper());

   WhereOrderBy Select  使 

LINQ 


LINQ  C# 3.0  Visual Basic 9.0   API  


使   CLR    Func 使
Func<string, bool>   filter  = s => s.Length == 5;
Func<string, string> extract = s => s;
Func<string, string> project = s => s.ToUpper();

IEnumerable<string> query = names.Where(filter) 
                                 .OrderBy(extract)
                                 .Select(project);

C# 2.0  使
Func<string, bool>   filter  = delegate (string s) {
                                   return s.Length == 5; 
                               };

Func<string, string> extract = delegate (string s) { 
                                   return s; 
                               };

Func<string, string> project = delegate (string s) {
                                   return s.ToUpper(); 
                               };

IEnumerable<string> query = names.Where(filter) 
                                 .OrderBy(extract)
                                 .Select(project);

使  

 System.Linq.Expressions IL<T>  

IL使 IL T<T> 

2
Func<int, bool>             f = n => n < 5;
Expression<Func<int, bool>> e = n => n < 5;

 f
bool isSmall = f(2); // isSmall is now true

 e
bool isSmall = e(2); // compile error, expressions == data


Expression<Func<int, bool>> filter = n => n < 5;

BinaryExpression    body  = (BinaryExpression)filter.Body;
ParameterExpression left  = (ParameterExpression)body.Left;
ConstantExpression  right = (ConstantExpression)body.Right;

Console.WriteLine("{0} {1} {2}", 
                  left.Name, body.NodeType, right.Value);


n LessThan 5

 LINQ to SQL   T-SQL 


 1    使  

CLR  [System.Runtime.CompilerServices.Extension]   C#     
namespace System.Linq {
  using System;
  using System.Collections.Generic;

  public static class Enumerable {
    public static IEnumerable<T> Where<T>(
             this IEnumerable<T> source,
             Func<T, bool> predicate) {

      foreach (T item in source)
        if (predicate(item))
          yield return item;
    }
  }
}

 Where  IEnumerable<T>  Where 
IEnumerable<string> query = Enumerable.Where(names, 
                                          s => s.Length <6);

使
IEnumerable<string> query = names.Where(s => s.Length <6);

 C#  using  Visual Basic  Import 使

 System.Linq.Enumerable  調 IEnumerable<T>    IEnumerable<T> C#  using 
using System.Linq; // makes query operators visible

   System.Linq  IEnumerable<T> 

使   
public class MySequence : IEnumerable<int> {
  public IEnumerator<int> GetEnumerator() {
    for (int i = 1; i <= 10; i++) 
      yield return i; 
  }

  IEnumerator IEnumerable.GetEnumerator() {
    return GetEnumerator(); 
  }

  public IEnumerable<int> Where(Func<int, bool> filter) {
    for (int i = 1; i <= 10; i++) 
      if (filter(i)) 
        yield return i;
  }
}

  MySequence.Where 使
MySequence s = new MySequence();
foreach (int item in s.Where(n => n >3))
    Console.WriteLine(item);

OfType IEnumerable<T> 1 OfType 
public static IEnumerable<T> OfType<T>(this IEnumerable source) {
  foreach (object item in source) 
    if (item is T) 
      yield return (T)item;
}

OfType IEnumerable<T> .NET Framework 1.0  IEnumerable  OfType 使 .NET 
// "classic" cannot be used directly with query operators
IEnumerable classic = new OlderCollectionType();

// "modern" can be used directly with query operators
IEnumerable<object> modern = classic.OfType<object>();

 modern    IEnumerable<T> 

OfType   OfType  
object[] vals = { 1, "Hello", true, "World", 9.1 };
IEnumerable<string> justStrings = vals.OfType<string>();

foreach  justStrings "Hello"  "World" 2


 Where  C# 2.0  yield 使  yield 使foreach 使 GetEnumerator  MoveNext 使  IEnumerable<T> 

  ToList  ToArray 2 List<T> 


// declare a variable containing some strings
string[] names = { "Allen", "Arthur", "Bennett" };

// declare a variable that represents a query
IEnumerable<string> ayes = names.Where(s => s[0] == 'A');

// evaluate the query
foreach (string item in ayes) 
  Console.WriteLine(item);

// modify the original information source
names[0] = "Bob";

// evaluate the query again, this time no "Allen"
foreach (string item in ayes) 
    Console.WriteLine(item);

 ayes    ToList  ToArray 
// declare a variable containing some strings
string[] names = { "Allen", "Arthur", "Bennett" };

// declare a variable that represents the result
// of an immediate query evaluation
string[] ayes = names.Where(s => s[0] == 'A').ToArray();

// iterate over the cached query results
foreach (string item in ayes) 
    Console.WriteLine(item);

// modifying the original source has no effect on ayes
names[0] = "Bob";

// iterate over result again, which still contains "Allen"
foreach (string item in ayes)
    Console.WriteLine(item);

ToArray  ToList   ( First ElementAt Sum Average All Any ) 

IQueryable<T> 


LINQ to SQL使   LINQ 使 IQueryable<T>   IQueryable<T>   IQueryable<T>    IQueryable<T>  1 LINQ to SQL 1 SQL 

IQueryable<T>     使 


  LINQ    
public class Person {
  string name;
  int age;
  bool canCode;

  public string Name {
    get { return name; } set { name = value; }
  }

  public int Age {
    get { return age; } set { age = value; }
  }

  public bool CanCode {
    get { return canCode; } set { canCode = value; }
  }
}

使   Person 
Person value = new Person {
    Name = "Chris Smith", Age = 31, CanCode = false
};


Person value = new Person();
value.Name = "Chris Smith";
value.Age = 31;
value.CanCode = false;

 ()   Person 
IEnumerable<Person> query = names.Select(s => new Person {
    Name = s, Age = 21, CanCode = s.Length == 5
});

便 使
static Person[] people = {
  new Person { Name="Allen Frances", Age=11, CanCode=false },
  new Person { Name="Burke Madison", Age=50, CanCode=true },
  new Person { Name="Connor Morgan", Age=59, CanCode=false },
  new Person { Name="David Charles", Age=33, CanCode=true },
  new Person { Name="Everett Frank", Age=16, CanCode=true },
};


LINQ   使   

C#  2
object v1 = new Person {
    Name = "Brian Smith", Age = 31, CanCode = false
};

object v2 = new { // note the omission of type name
    Name = "Brian Smith", Age = 31, CanCode = false
};

 v1  v2 CLR 3  Name Age CanCode   v2   CLR   使

C# var  (keyword)使  C# 3.0 
var s = "Bob";
var n = 32;
var b = true;

var  (keyword)使  s n b string int bool  
string s = "Bob";
int    n = 32;
bool   b = true;

var  (keyword)便
var value = new { 
  Name = " Brian Smith", Age = 31, CanCode = false
};

   C# 
internal class ??? {
  string _Name;
  int    _Age;
  bool   _CanCode;

  public string Name { 
    get { return _Name; } set { _Name = value; }
  }

  public int Age{ 
    get { return _Age; } set { _Age = value; }
  }

  public bool CanCode { 
    get { return _CanCode; } set { _CanCode = value; }
  }

  public bool Equals(object obj) { ... }

  public bool GetHashCode() { ... }
}

/1

1使 


var bob = new Person { Name = "Bob", Age = 51, CanCode = true };
var jane = new { Age = 29, FirstName = "Jane" };

var couple = new {
    Husband = new { bob.Name, bob.Age },
    Wife = new { Name = jane.FirstName, jane.Age }
};

int    ha = couple.Husband.Age; // ha == 51
string wn = couple.Wife.Name;   // wn == "Jane"

便
var couple = new {
    Husband = new { Name = bob.Name, Age = bob.Age },
    Wife = new { Name = jane.FirstName, Age = jane.Age }
};

2bob  jane  Name  Age 

 select 使 
var query = people.Select(p => new { 
               p.Name, BadCoder = p.Age == 11
           });

foreach (var item in query) 
  Console.WriteLine("{0} is a {1} coder", 
                     item.Name,
                     item.BadCoder ? "bad" : "good");

 Person 


便便


   OrderBy 

OrderBy  OrderByDescending 使 OrderBy  OrderByDescending 使 
string[] names = { "Burke", "Connor", "Frank", "Everett", 
                   "Albert", "George", "Harris", "David" };

// unity sort
var s1 = names.OrderBy(s =>s); 
var s2 = names.OrderByDescending(s =>s);

// sort by length
var s3 = names.OrderBy(s => s.Length); 
var s4 = names.OrderByDescending(s => s.Length);

222

OrderBy  OrderByDescending  IEnumerable<T OrderedSequence T> ><2 OrderedSequence<T>  ()  ThenBy  ThenByDescending  ThenBy/ThenByDescending  OrderedSequence<T> ThenBy/ThenByDescending  
string[] names = { "Burke", "Connor", "Frank", "Everett", 
                   "Albert", "George", "Harris", "David" };

var s1 = names.OrderBy(s => s.Length).ThenBy(s =>s);

 s1 
"Burke", "David", "Frank", 
"Albert", "Connor", "George", "Harris", 
"Everett"

OrderBy  Reverse  Reverse  OrderBy Reverse 

OrderBy   GroupBy  GroupBy 1IGrouping  IGrouping 使 IEnumerable 
public interface IGrouping<K, T> : IEnumerable<T> {
  public K Key { get; }
}

GroupBy 
string[] names = { "Albert", "Burke", "Connor", "David",
                   "Everett", "Frank", "George", "Harris"};

// group by length
var groups = names.GroupBy(s => s.Length);

foreach (IGrouping<int, string> group in groups) {
    Console.WriteLine("Strings of length {0}", group.Key);

    foreach (string value in group)
        Console.WriteLine("  {0}", value);
}    


Strings of length 6
  Albert
  Connor
  George
  Harris
Strings of length 5
  Burke
  David
  Frank
Strings of length 7
  Everett

GroupBy    使
string[] names = { "Albert", "Burke", "Connor", "David",
                   "Everett", "Frank", "George", "Harris"};

// group by length
var groups = names.GroupBy(s => s.Length, s => s[0]);
foreach (IGrouping<int, char> group in groups) {
    Console.WriteLine("Strings of length {0}", group.Key);

    foreach (char value in group)
        Console.WriteLine("  {0}", value);
}  


Strings of length 6
  A
  C
  G
  H
Strings of length 5
  B
  D
  F
Strings of length 7
  E


  


1  Aggregate 
public static U Aggregate<T, U>(this IEnumerable<T> source, 
                                U seed, Func<U, T, U> func) {
  U result = seed;

  foreach (T element in source) 
      result = func(result, element);

  return result;
}

Aggregate 使  1 Aggregate  ( Aggregate  )  Aggregate 

 Aggregate 使
string[] names = { "Albert", "Burke", "Connor", "David",
                   "Everett", "Frank", "George", "Harris"};

int count = names.Aggregate(0, (c, s) => c + s.Length);
// count == 46

    Count 4 (Min Max Sum Average)   ( int double decimal ) 

 Sum 
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
string[] names = { "Albert", "Burke", "Connor", "David",
                   "Everett", "Frank", "George", "Harris"};

int total1 = numbers.Sum();            // total1 == 55
int total2 = names.Sum(s => s.Length); // total2 == 46


2 Sum  Aggregate 使

Select vs. SelectMany


Select  1   String.Split 使
string[] text = { "Albert was here", 
                  "Burke slept late", 
                  "Connor is happy" };

var tokens = text.Select(s => s.Split(' '));

foreach (string[] line in tokens)
    foreach (string token in line)
        Console.Write("{0}.", token);


Albert.was.here.Burke.slept.late.Connor.is.happy.

  []   Select  SelectMany 使 SelectMany Select   SelectMany  SelectMany 使
string[] text = { "Albert was here", 
                  "Burke slept late", 
                  "Connor is happy" };

var tokens = text.SelectMany(s => s.Split(' '));

foreach (string token in tokens)
    Console.Write("{0}.", token);

SelectMany 使

SelectMany 2
string[] names = { "Burke", "Connor", "Frank", "Everett", 
                   "Albert", "George", "Harris", "David" };

var query = names.SelectMany(n => 
                     people.Where(p => n.Equals(p.Name))
                 );

SelectMany  n  n 1 SelectMany    


  ID使 

SelectMany 使  SelectMany      (2 "") 1 Join 
string[] names = { "Burke", "Connor", "Frank", "Everett", 
                   "Albert", "George", "Harris", "David" };

var query = names.Join(people, n => n, p => p.Name, (n,p) =>p);

 Join ""    ""   people 23  Join 使  Name   n p使  n p  Person 

Join  GroupJoin  GroupJoin 使 Join 1 :
string[] names = { "Burke", "Connor", "Frank", "Everett", 
                   "Albert", "George", "Harris", "David" };

var query = names.GroupJoin(people, n => n, p => p.Name,                   
                 (n, matching) => 
                      new { Name = n, Count = matching.Count() }
);

  GroupJoin 使


C#   foreach .NET Frameworks IEnumerable/IEnumerator  foreach 便

使 (WhereJoinGroupJoinSelectSelectManyGroupByOrderByThenByOrderByDescendingThenByDescendingThenByDescendingCast) 使


IEnumerable<string> query = names 
                            .Where(s => s.Length == 5) 
                            .OrderBy(s =>s)
                            .Select(s => s.ToUpper());

使
IEnumerable<string> query = from s in names 
                            where s.Length == 5
                            orderby s
                            select s.ToUpper();

C#  foreach  使 () 

 C#  from  select  group   from 0  from  let  where  join  orderby   from  let  where      orderby 
query-expression ::= from-clause query-body

query-body ::= 

      query-body-clause* final-query-clause query-continuation?

query-body-clause ::=
 (from-clause 
      | join-clause 
      | let-clause 
      | where-clause 
      | orderby-clause)

from-clause ::=from itemName in srcExpr

join-clause ::=join itemName in srcExpr on keyExpr equals keyExpr 
       (into itemName)?

let-clause ::=let itemName = selExpr

where-clause ::= where predExpr

orderby-clause ::= orderby (keyExpr (ascending | descending)?)*

final-query-clause ::=
 (select-clause | groupby-clause)

select-clause ::= select selExpr

groupby-clause ::= group selExpr by keyExprquery-continuation ::= intoitemName query-body

2
var query1 = from p in people
             where p.Age > 20
             orderby p.Age descending, p.Name
             select new { 
                 p.Name, Senior = p.Age > 30, p.CanCode
             };

var query2 = from p in people
             where p.Age > 20
             orderby p.Age descending, p.Name
             group new { 
                p.Name, Senior = p.Age > 30, p.CanCode
             } by p.CanCode;

使
var query1 = people.Where(p => p.Age >20)
                   .OrderByDescending(p => p.Age)
                   .ThenBy(p => p.Name)
                   .Select(p => new { 
                       p.Name, 
                       Senior = p.Age > 30, 
                       p.CanCode
                   });

var query2 = people.Where(p => p.Age >20)
                   .OrderByDescending(p => p.Age)
                   .ThenBy(p => p.Name)
                   .GroupBy(p => p.CanCode, 
                            p => new {
                                   p.Name, 
                                   Senior = p.Age > 30, 
                                   p.CanCode
                   });

   

1使 使 
var query = from s1 in names 
            where s1.Length == 5
            from s2 in names 
            where s1 == s2
            select s1 + " " + s2;

 :
string[] names = { "Burke", "Connor", "Frank", "Everett", 
                   "Albert", "George", "Harris", "David" };


Burke Burke
Frank Frank
David David


var query = names.Where(s1 => s1.Length == 5)
                 .SelectMany(s1 => names, (s1,s2) => new {s1,s2})
                 .Where($1 => $1.s1 == $1.s2) 
                 .Select($1 => $1.s1 + " " + $1.s2);


  SelectMany 使 2  $1 


 join  join 1into 
var query = from n in names
            join p in people on n equals p.Name into matching
            select new { Name = n, Count = matching.Count() };


var query = names.GroupJoin(people, n => n, p => p.Name,                   
           (n, matching) => 
                      new { Name = n, Count = matching.Count() }
);

1便  使select  group  (keyword)  

 (keyword) group by便 
var query = from item in names
            orderby item
            group item by item.Length into lengthGroups
            orderby lengthGroups.Key descending
            select lengthGroups;

foreach (var group in query) { 
    Console.WriteLine("Strings of length {0}", group.Key);

    foreach (var val in group)
        Console.WriteLine("  {0}", val);
}


Strings of length 7
  Everett
Strings of length 6
  Albert
  Connor
  George
  Harris
Strings of length 5
  Burke
  David
  Frank

C#  使

 使    使 IEnumerable<T>   

LINQ  API (SQL   LINQ  LINQ to SQL) XML  LINQ LINQ to XML2 LINQ  API LINQ  

LINQ to SQL: SQL 


.NET Language-Integrated 使     (LINQ to SQL) SQL  CLR  SQL  CLR 

LINQ to SQL SQL  CLR  [Table]  [Column] 2 [Table] CLR  SQL  [Column]  SQL  SQL   SQL 
create table People (
    Name nvarchar(32) primary key not null, 
    Age int not null, 
    CanCode bit not null
)

create table Orders (
    OrderID nvarchar(32) primary key not null, 
    Customer nvarchar(32) not null, 
    Amount int
)

 CLR 
[Table(Name="People")]
public class Person {
  [Column(DbType="nvarchar(32) not null", Id=true)]
  public string Name; 

  [Column]
  public int Age;

  [Column]
  public bool CanCode;
}

[Table(Name="Orders")]
public class Order {
  [Column(DbType="nvarchar(32) not null", Id=true)]
  public string OrderID; 

  [Column(DbType="nvarchar(32) not null")]        
  public string Customer; 

  [Column]
  public int? Amount; 
}


NULL  CLR  null  (null .NET Framework 2.0 )CLR  (nvarcharchartext ) 11 SQL  SQL  CLR 


 LINQ LINQ to SQL SQL  DbCommand  ADO.NET  
// establish a query context over ADO.NET sql connection
DataContext context = new DataContext(
     "Initial Catalog=petdb;Integrated Security=sspi");

// grab variables that represent the remote tables that 
// correspond to the Person and Order CLR types
Table<Person> custs = context.GetTable<Person>();
Table<Order> orders   = context.GetTable<Order>();

// build the query
var query = from c in custs
            from o in orders
            where o.Customer == c.Name
            select new { 
                       c.Name, 
                       o.OrderID,
                       o.Amount,
                       c.Age
            }; 

// execute the query
foreach (var item in query) 
    Console.WriteLine("{0} {1} {2} {3}", 
                      item.Name, item.OrderID, 
                      item.Amount, item.Age);

DataContext  SQL  DataContext  ADO.NET IDbConnection 使 ADO.NET 使

GetTable  使 IEnumerable  GetTable 使  C#  foreach 使  DataContext  SQL 
SELECT [t0].[Age], [t1].[Amount], 
       [t0].[Name], [t1].[OrderID]
FROM [Customers] AS [t0], [Orders] AS [t1]
WHERE [t1].[Customer] = [t0].[Name]

  CLR   /   LINQ to SQL   使 Customer  Orders 2  使 

LINQ to XML: XML 


.NET Language-Integrated QUERY for XML (LINQ to XML) 使 XPath 使 XML   System.Xml / W3C DOM 使 XML  XML  XName XElement  XAttribute 3

XName 使 (QNames) 使 XName QName 使

XML  XElement  XAttribute  使 XElement  XAttribute  使 XML 
var e = new XElement("Person", 
                     new XAttribute("CanCode", true),
                     new XElement("Name", "Loren David"),
                     new XElement("Age", 31));

var s = e.ToString();

 XML 
<Person CanCode="true">
  <Name>Loren David</Name> 
  <Age>31</Age> 
</Person>

XML  DOM   ToString  XML  XML  XmlReader 
var e2 = XElement.Load(xmlReader);
var e1 = XElement.Parse(
@"<Person CanCode='true'>
  <Name>Loren David</Name>
  <Age>31</Age>
</Person>");

XElement  XmlWriter 使 XML 

XElement  select  XElements XML XML 
var query = from p in people 
            where p.CanCode
            select new XElement("Person", 
                                  new XAttribute("Age", p.Age),
                                  p.Name);

 XElements   XElements  XElement 使
var x = new XElement("People",
                  from p in people 
                  where p.CanCode
                  select 
                    new XElement("Person", 
                                   new XAttribute("Age", p.Age),
                                   p.Name));

 XML  XML 
<People>
  <Person Age="11">Allen Frances</Person> 
  <Person Age="59">Connor Morgan</Person> 
</People>

Visual Basic  Visual Basic 9.0  XML 使Visual Basic  XML 使 Visual Basic 使
 Dim x = _
        <People>
             <%= From p In people __
                 Where p.CanCode _

                 Select <Person Age=<%= p.Age %>>p.Name</Person> _
             %>
        </People>

使 XML    XElement  XAttribute 使XML  XElement  XPath    XElement 
IEnumerable<string> justNames =
    from e in x.Descendants("Person")
    select e.Value;

//justNames = ["Allen Frances", "Connor Morgan"]

XML select 使
IEnumerable<Person> persons =
    from e in x.Descendants("Person")
    select new Person { 
        Name = e.Value,
        Age = (int)e.Attribute("Age") 
    };

XAttribute  XElement  null 
IEnumerable<Person> persons =
    from e in x.Descendants("Person")
    select new Person { 
        Name = e.Value,
        Age = (int?)e.Attribute("Age") ?? 21
    };

Age 21 使

Visual Basic 9.0 XElement  ElementsAttribute Descendants  XML 使 XML  使 C# 
Dim persons = _
      From e In x...<Person> _   
      Select new Person { _
          .Name = e.Value, _
          .Age = IIF(e.@Age, 21) _
      } 

Visual Basic x...<Person> Person  x Descendants  e.@Age  Age. The Value  XAttributes  Value 


.NET Language-Integrated CLR  使使 LINQ IEnumerable<T> ADO.NET (LINQ to SQL) System.Xml (LINQ to XML)  XML 


演算子 説明
Where 述語関数に基づく制限演算子
Select/SelectMany セレクター関数に基づく射影演算子
Take/Skip/TakeWhile/SkipWhile 位置または述語関数に基づくパーティション分割演算子
Join/GroupJoin キー セレクター関数に基づく結合演算子
Concat Concatenation 操作
OrderBy/ThenBy/OrderByDescending/ThenByDescending オプションのキー セレクター関数と比較関数に基づいて昇順または降順で並べ替える演算子の並べ替え
Reverse シーケンスの順序を逆にする並べ替え演算子
GroupBy オプションのキー セレクター関数と比較子関数に基づくグループ化演算子
Distinct 重複を削除する演算子を設定する
和集合/交差 集合和集合または交差を返すセット演算子
除く セットの差を返す Set 演算子
AsEnumerable IEnumerable<T> への変換演算子
ToArray/ToList 配列またはリスト<T> への変換演算子
ToDictionary/ToLookup キー セレクター関数に基づく辞書<K、T>、Lookup<K、T> (マルチディクショナリ) への変換演算子
OfType/Cast フィルター処理または型引数への変換に基づく IEnumerable<T> への変換演算子
SequenceEqual ペアごとの要素の等価性をチェックする等値演算子
First/FirstOrDefault/Last/LastOrDefault/Single/SingleOrDefault 省略可能な述語関数に基づいて初期/最終/のみ要素を返す要素演算子
ElementAt/ElementAtOrDefault 位置に基づいて要素を返す要素演算子
DefaultIfEmpty 空のシーケンスを既定値のシングルトン シーケンスに置き換える要素演算子
Range 範囲内の数値を返す生成演算子
Repeat 指定された値の複数の出現箇所を返す生成演算子
Empty 空のシーケンスを返す生成演算子
Any/All 述語関数の存在またはユニバーサル満足度の量指定子チェック
Contains 特定の要素の存在を確認する量指定子
Count/LongCount 省略可能な述語関数に基づいて要素をカウントする集計演算子
Sum/Min/Max/Average オプションのセレクター関数に基づく集計演算子
Aggregate 累積関数とオプションのシードに基づいて複数の値を累積する集計演算子