Enumerable.Distinct メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
シーケンスから一意の要素を返します。
オーバーロード
Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) |
指定された IEqualityComparer<T> を使用して値を比較することにより、シーケンスから一意の要素を返します。 |
Distinct<TSource>(IEnumerable<TSource>) |
既定の等値比較子を使用して値を比較することにより、シーケンスから一意の要素を返します。 |
注釈
結果シーケンスは順序付けされません。
Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>)
- ソース:
- Distinct.cs
- ソース:
- Distinct.cs
- ソース:
- Distinct.cs
指定された IEqualityComparer<T> を使用して値を比較することにより、シーケンスから一意の要素を返します。
public:
generic <typename TSource>
[System::Runtime::CompilerServices::Extension]
static System::Collections::Generic::IEnumerable<TSource> ^ Distinct(System::Collections::Generic::IEnumerable<TSource> ^ source, System::Collections::Generic::IEqualityComparer<TSource> ^ comparer);
public static System.Collections.Generic.IEnumerable<TSource> Distinct<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, System.Collections.Generic.IEqualityComparer<TSource> comparer);
public static System.Collections.Generic.IEnumerable<TSource> Distinct<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, System.Collections.Generic.IEqualityComparer<TSource>? comparer);
static member Distinct : seq<'Source> * System.Collections.Generic.IEqualityComparer<'Source> -> seq<'Source>
<Extension()>
Public Function Distinct(Of TSource) (source As IEnumerable(Of TSource), comparer As IEqualityComparer(Of TSource)) As IEnumerable(Of TSource)
型パラメーター
- TSource
source
の要素の型。
パラメーター
- source
- IEnumerable<TSource>
重複する要素を削除する対象となるシーケンス。
- comparer
- IEqualityComparer<TSource>
値を比較する IEqualityComparer<T>。
戻り値
ソース シーケンスの一意の要素を格納する IEnumerable<T>。
例外
source
が null
です。
例
次の例は、 メソッドで使用できる等値比較子を実装する方法を Distinct 示しています。
public class Product
{
public string Name { get; set; }
public int Code { get; set; }
}
// Custom comparer for the Product class
class ProductComparer : IEqualityComparer<Product>
{
// Products are equal if their names and product numbers are equal.
public bool Equals(Product x, Product y)
{
//Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(x, y)) return true;
//Check whether any of the compared objects is null.
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
//Check whether the products' properties are equal.
return x.Code == y.Code && x.Name == y.Name;
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public int GetHashCode(Product product)
{
//Check whether the object is null
if (Object.ReferenceEquals(product, null)) return 0;
//Get hash code for the Name field if it is not null.
int hashProductName = product.Name == null ? 0 : product.Name.GetHashCode();
//Get hash code for the Code field.
int hashProductCode = product.Code.GetHashCode();
//Calculate the hash code for the product.
return hashProductName ^ hashProductCode;
}
}
Public Class Product
Public Property Name As String
Public Property Code As Integer
End Class
' Custom comparer for the Product class
Public Class ProductComparer
Implements IEqualityComparer(Of Product)
Public Function Equals1(
ByVal x As Product,
ByVal y As Product
) As Boolean Implements IEqualityComparer(Of Product).Equals
' Check whether the compared objects reference the same data.
If x Is y Then Return True
'Check whether any of the compared objects is null.
If x Is Nothing OrElse y Is Nothing Then Return False
' Check whether the products' properties are equal.
Return (x.Code = y.Code) AndAlso (x.Name = y.Name)
End Function
Public Function GetHashCode1(
ByVal product As Product
) As Integer Implements IEqualityComparer(Of Product).GetHashCode
' Check whether the object is null.
If product Is Nothing Then Return 0
' Get hash code for the Name field if it is not null.
Dim hashProductName =
If(product.Name Is Nothing, 0, product.Name.GetHashCode())
' Get hash code for the Code field.
Dim hashProductCode = product.Code.GetHashCode()
' Calculate the hash code for the product.
Return hashProductName Xor hashProductCode
End Function
End Class
この比較子を実装した後、次の例に示すように、 メソッドでDistinctオブジェクトのProduct
シーケンスを使用できます。
Product[] products = { new Product { Name = "apple", Code = 9 },
new Product { Name = "orange", Code = 4 },
new Product { Name = "apple", Code = 9 },
new Product { Name = "lemon", Code = 12 } };
// Exclude duplicates.
IEnumerable<Product> noduplicates =
products.Distinct(new ProductComparer());
foreach (var product in noduplicates)
Console.WriteLine(product.Name + " " + product.Code);
/*
This code produces the following output:
apple 9
orange 4
lemon 12
*/
Dim products() As Product =
{New Product With {.Name = "apple", .Code = 9},
New Product With {.Name = "orange", .Code = 4},
New Product With {.Name = "apple", .Code = 9},
New Product With {.Name = "lemon", .Code = 12}}
' Exclude duplicates.
Dim noduplicates = products.Distinct(New ProductComparer())
For Each product In noduplicates
Console.WriteLine(product.Name & " " & product.Code)
Next
' This code produces the following output:
'
' apple 9
' orange 4
' lemon 12
'
注釈
このメソッドは、遅延実行を使用して実装されます。 即時戻り値は、アクションの実行に必要なすべての情報を格納する オブジェクトです。 このメソッドで表されるクエリは、オブジェクトがメソッドを直接呼び出GetEnumerator
すか、C# または For Each
Visual Basic で を使用foreach
して列挙されるまで実行されません。
メソッドは Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) 、重複する値を含まない順序なしのシーケンスを返します。 が null
の場合comparer
、値の比較には既定の等値比較子 Defaultが使用されます。
適用対象
Distinct<TSource>(IEnumerable<TSource>)
- ソース:
- Distinct.cs
- ソース:
- Distinct.cs
- ソース:
- Distinct.cs
既定の等値比較子を使用して値を比較することにより、シーケンスから一意の要素を返します。
public:
generic <typename TSource>
[System::Runtime::CompilerServices::Extension]
static System::Collections::Generic::IEnumerable<TSource> ^ Distinct(System::Collections::Generic::IEnumerable<TSource> ^ source);
public static System.Collections.Generic.IEnumerable<TSource> Distinct<TSource> (this System.Collections.Generic.IEnumerable<TSource> source);
static member Distinct : seq<'Source> -> seq<'Source>
<Extension()>
Public Function Distinct(Of TSource) (source As IEnumerable(Of TSource)) As IEnumerable(Of TSource)
型パラメーター
- TSource
source
の要素の型。
パラメーター
- source
- IEnumerable<TSource>
重複する要素を削除する対象となるシーケンス。
戻り値
ソース シーケンスの一意の要素を格納する IEnumerable<T>。
例外
source
が null
です。
例
次のコード例では、 を使用 Distinct<TSource>(IEnumerable<TSource>) して、整数のシーケンスから個別の要素を返す方法を示します。
List<int> ages = new List<int> { 21, 46, 46, 55, 17, 21, 55, 55 };
IEnumerable<int> distinctAges = ages.Distinct();
Console.WriteLine("Distinct ages:");
foreach (int age in distinctAges)
{
Console.WriteLine(age);
}
/*
This code produces the following output:
Distinct ages:
21
46
55
17
*/
' Create a list of integers.
Dim ages As New List(Of Integer)(New Integer() _
{21, 46, 46, 55, 17, 21, 55, 55})
' Select the unique numbers in the List.
Dim distinctAges As IEnumerable(Of Integer) = ages.Distinct()
Dim output As New System.Text.StringBuilder("Distinct ages:" & vbCrLf)
For Each age As Integer In distinctAges
output.AppendLine(age)
Next
' Display the output.
Console.WriteLine(output.ToString)
' This code produces the following output:
'
' Distinct ages:
' 21
' 46
' 55
' 17
カスタム データ型のオブジェクトのシーケンスから個別の要素を返す場合は、 クラスにジェネリック インターフェイスを IEquatable<T> 実装する必要があります。 次のコード例は、このインターフェイスをカスタム データ型に実装し、 メソッドと Equals メソッドを提供GetHashCodeする方法を示しています。
public class MyProduct : IEquatable<MyProduct>
{
public string Name { get; set; }
public int Code { get; set; }
public bool Equals(MyProduct other)
{
//Check whether the compared object is null.
if (Object.ReferenceEquals(other, null)) return false;
//Check whether the compared object references the same data.
if (Object.ReferenceEquals(this, other)) return true;
//Check whether the products' properties are equal.
return Code.Equals(other.Code) && Name.Equals(other.Name);
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public override int GetHashCode()
{
//Get hash code for the Name field if it is not null.
int hashProductName = Name == null ? 0 : Name.GetHashCode();
//Get hash code for the Code field.
int hashProductCode = Code.GetHashCode();
//Calculate the hash code for the product.
return hashProductName ^ hashProductCode;
}
}
Public Class Product
Implements IEquatable(Of Product)
Public Property Name As String
Public Property Code As Integer
Public Function Equals1(
ByVal other As Product
) As Boolean Implements IEquatable(Of Product).Equals
' Check whether the compared object is null.
If other Is Nothing Then Return False
' Check whether the compared object references the same data.
If Me Is Other Then Return True
' Check whether the products' properties are equal.
Return Code.Equals(other.Code) AndAlso Name.Equals(other.Name)
End Function
Public Overrides Function GetHashCode() As Integer
' Get hash code for the Name field if it is not null.
Dim hashProductName = If(Name Is Nothing, 0, Name.GetHashCode())
' Get hash code for the Code field.
Dim hashProductCode = Code.GetHashCode()
' Calculate the hash code for the product.
Return hashProductName Xor hashProductCode
End Function
End Class
このインターフェイスを実装した後、次の例に示すように、 メソッドでDistinct<TSource>(IEnumerable<TSource>)オブジェクトのProduct
シーケンスを使用できます。
MyProduct[] products = { new MyProduct { Name = "apple", Code = 9 },
new MyProduct { Name = "orange", Code = 4 },
new MyProduct { Name = "apple", Code = 9 },
new MyProduct { Name = "lemon", Code = 12 } };
// Exclude duplicates.
IEnumerable<MyProduct> noduplicates =
products.Distinct();
foreach (var product in noduplicates)
Console.WriteLine(product.Name + " " + product.Code);
/*
This code produces the following output:
apple 9
orange 4
lemon 12
*/
Dim products() As Product =
{New Product With {.Name = "apple", .Code = 9},
New Product With {.Name = "orange", .Code = 4},
New Product With {.Name = "apple", .Code = 9},
New Product With {.Name = "lemon", .Code = 12}}
' Exclude duplicates.
Dim noduplicates = products.Distinct()
For Each product In noduplicates
Console.WriteLine(product.Name & " " & product.Code)
Next
' This code produces the following output:
'
' apple 9
' orange 4
' lemon 12
'
注釈
このメソッドは、遅延実行を使用して実装されます。 即時戻り値は、アクションの実行に必要なすべての情報を格納する オブジェクトです。 このメソッドで表されるクエリは、オブジェクトがメソッドを直接呼び出GetEnumerator
すか、C# または For Each
Visual Basic で を使用foreach
して列挙されるまで実行されません。
メソッドは Distinct<TSource>(IEnumerable<TSource>) 、重複する値を含まない順序なしのシーケンスを返します。 既定の等値比較子 を使用して値 Defaultを比較します。
Visual Basic クエリ式の構文では、 句は Distinct
の Distinct呼び出しに変換されます。
既定の等値比較子 は、 Defaultジェネリック インターフェイスを実装する型の値を IEquatable<T> 比較するために使用されます。 カスタム データ型を比較するには、このインターフェイスを実装し、型に独自 GetHashCode の メソッドと Equals メソッドを提供する必要があります。
を使用 IEqualityComparer<T> してカスタム 比較子を定義する例については、「」を参照してください Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>)。
こちらもご覧ください
適用対象
.NET