Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Setbewerkingen in LINQ verwijzen naar querybewerkingen die een resultatenset produceren op basis van de aanwezigheid of afwezigheid van equivalente elementen in dezelfde of afzonderlijke verzamelingen.
Belangrijk
In deze voorbeelden wordt een System.Collections.Generic.IEnumerable<T> gegevensbron gebruikt. Gegevensbronnen die gebaseerd zijn op System.Linq.IQueryProvider maken gebruik van System.Linq.IQueryable<T> gegevensbronnen en expressiebomen. Expressiestructuren hebben beperkingen voor de toegestane C#-syntaxis. Bovendien kan elke IQueryProvider gegevensbron, zoals EF Core , meer beperkingen opleggen. Raadpleeg de documentatie voor uw gegevensbron.
| Methodenamen | Beschrijving | C#-query-expressie-syntaxis | Meer informatie |
|---|---|---|---|
Distinct of DistinctBy |
Hiermee verwijdert u dubbele waarden uit een verzameling. | Niet van toepassing. | Enumerable.Distinct Enumerable.DistinctBy Queryable.Distinct Queryable.DistinctBy |
Except of ExceptBy |
Retourneert het ingestelde verschil, wat betekent dat de elementen van één verzameling die niet in een tweede verzameling worden weergegeven. | Niet van toepassing. | Enumerable.Except Enumerable.ExceptBy Queryable.Except Queryable.ExceptBy |
Intersect of IntersectBy |
Retourneert het snijpunt van de set, wat betekent dat elementen in elk van twee verzamelingen worden weergegeven. | Niet van toepassing. | Enumerable.Intersect Enumerable.IntersectBy Queryable.Intersect Queryable.IntersectBy |
Union of UnionBy |
Retourneert de samenvoeging van de set, wat betekent dat er unieke elementen worden weergegeven in een van de twee verzamelingen. | Niet van toepassing. | Enumerable.Union Enumerable.UnionBy Queryable.Union Queryable.UnionBy |
Distinct en DistinctBy
In het volgende voorbeeld ziet u het gedrag van de Enumerable.Distinct methode op een reeks tekenreeksen. De geretourneerde reeks bevat de unieke elementen uit de invoerreeks.
string[] words = ["the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"];
IEnumerable<string> query = from word in words.Distinct()
select word;
foreach (var str in query)
{
Console.WriteLine(str);
}
/* This code produces the following output:
*
* the
* quick
* brown
* fox
* jumped
* over
* lazy
* dog
*/
Het DistinctBy is een alternatieve benadering voor Distinct, waarbij een keySelector betrokken is. De keySelector wordt gebruikt als de vergelijkende discriminator van het brontype. In de volgende code worden woorden gediscrimineerd op basis van hun Length, en het eerste woord van elke lengte wordt weergegeven:
string[] words = ["the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"];
foreach (string word in words.DistinctBy(p => p.Length))
{
Console.WriteLine(word);
}
// This code produces the following output:
// the
// quick
// jumped
// over
Except en ExceptBy
In het volgende voorbeeld ziet u het gedrag van Enumerable.Except. De geretourneerde reeks bevat alleen de elementen uit de eerste invoerreeks die zich niet in de tweede invoerreeks bevinden.
Notitie
In de volgende voorbeelden in dit artikel worden de algemene gegevensbronnen voor dit gebied gebruikt.
Elk Student heeft een cijferniveau, een primaire afdeling en een reeks scores. Een Teacher heeft ook een City eigenschap die de campus identificeert waar de docent klassen heeft. A Department heeft een naam en een verwijzing naar een Teacher persoon die als afdelingshoofd fungeert.
U vindt de voorbeeldgegevensset in de bronopslagplaats.
public enum GradeLevel
{
FirstYear = 1,
SecondYear,
ThirdYear,
FourthYear
};
public class Student
{
public required string FirstName { get; init; }
public required string LastName { get; init; }
public required int ID { get; init; }
public required GradeLevel Year { get; init; }
public required List<int> Scores { get; init; }
public required int DepartmentID { get; init; }
}
public class Teacher
{
public required string First { get; init; }
public required string Last { get; init; }
public required int ID { get; init; }
public required string City { get; init; }
}
public class Department
{
public required string Name { get; init; }
public int ID { get; init; }
public required int TeacherID { get; init; }
}
Notitie
Raadpleeg de algemene gegevensbronnen op dit gebied in het artikel Overzicht van de standaardquery-operators.
string[] words1 = ["the", "quick", "brown", "fox"];
string[] words2 = ["jumped", "over", "the", "lazy", "dog"];
IEnumerable<string> query = from word in words1.Except(words2)
select word;
foreach (var str in query)
{
Console.WriteLine(str);
}
/* This code produces the following output:
*
* quick
* brown
* fox
*/
De ExceptBy-methode is een alternatieve benadering voor Except die twee reeksen van mogelijk heterogene typen en een keySelector vereist. Het keySelector is hetzelfde type als het type van de eerste verzameling. Houd rekening met de volgende Teacher array en docent-ID's die moeten worden uitgesloten. Als u docenten in de eerste verzameling wilt zoeken die zich niet in de tweede verzameling bevinden, kunt u de id van de docent projecteren op de tweede verzameling:
int[] teachersToExclude =
[
901, // English
965, // Mathematics
932, // Engineering
945, // Economics
987, // Physics
901 // Chemistry
];
foreach (Teacher teacher in
teachers.ExceptBy(
teachersToExclude, teacher => teacher.ID))
{
Console.WriteLine($"{teacher.First} {teacher.Last}");
}
In de voorgaande C#-code:
- De
teachersarray wordt gefilterd om alleen die docenten uit te sluiten die zich niet in deteachersToExcludearray bevinden. - De
teachersToExcludematrix bevat deIDwaarde voor alle afdelingshoofden. - De aanroep van
ExceptByresulteert in een nieuwe set waarden die naar de console worden geschreven.
De nieuwe set waarden is van het type Teacher, het type van de eerste verzameling. Elk teacher in de teachers matrix die geen overeenkomende id-waarde in de teachersToExclude matrix heeft, wordt naar de console geschreven.
Intersect en IntersectBy
In het volgende voorbeeld ziet u het gedrag van Enumerable.Intersect. De geretourneerde reeks bevat de elementen die gebruikelijk zijn voor beide invoerreeksen.
string[] words1 = ["the", "quick", "brown", "fox"];
string[] words2 = ["jumped", "over", "the", "lazy", "dog"];
IEnumerable<string> query = from word in words1.Intersect(words2)
select word;
foreach (var str in query)
{
Console.WriteLine(str);
}
/* This code produces the following output:
*
* the
*/
De IntersectBy-methode is een alternatieve benadering voor Intersect die twee reeksen van mogelijk heterogene typen en een keySelector vereist. De keySelector wordt gebruikt als de vergelijkende discriminator van het type van de tweede verzameling. Houd rekening met de volgende matrices voor leerlingen/studenten en docenten. De query stemt items in elke reeks af op naam om die studenten te vinden die ook docenten zijn.
foreach (Student person in
students.IntersectBy(
teachers.Select(t => (t.First, t.Last)), s => (s.FirstName, s.LastName)))
{
Console.WriteLine($"{person.FirstName} {person.LastName}");
}
In de voorgaande C#-code:
- De query produceert het snijpunt van de
TeacherenStudentdoor namen te vergelijken. - Alleen personen die in beide matrices voorkomen, zijn aanwezig in de resulterende volgorde.
- De resulterende
Studentexemplaren worden naar de console geschreven.
Union en UnionBy
In het volgende voorbeeld ziet u een unie-bewerking op twee tekenreeksen. De geretourneerde reeks bevat de unieke elementen van beide invoerreeksen.
string[] words1 = ["the", "quick", "brown", "fox"];
string[] words2 = ["jumped", "over", "the", "lazy", "dog"];
IEnumerable<string> query = from word in words1.Union(words2)
select word;
foreach (var str in query)
{
Console.WriteLine(str);
}
/* This code produces the following output:
*
* the
* quick
* brown
* fox
* jumped
* over
* lazy
* dog
*/
De UnionBy methode is een alternatieve benadering bij Union die twee reeksen van hetzelfde type en een keySelector neemt. De keySelector wordt gebruikt als de vergelijkende discriminator van het brontype. De volgende query produceert de lijst met alle personen die leerlingen/studenten of docenten zijn. Studenten die ook als docenten werken, worden slechts één keer aan de verenigingsverzameling toegevoegd.
foreach (var person in
students.Select(s => (s.FirstName, s.LastName)).UnionBy(
teachers.Select(t => (FirstName: t.First, LastName: t.Last)), s => (s.FirstName, s.LastName)))
{
Console.WriteLine($"{person.FirstName} {person.LastName}");
}
In de voorgaande C#-code:
- De
teachersenstudentsmatrices worden geweven met behulp van hun namen als de sleutelkiezer. - De resulterende namen worden naar de console geschreven.