【C#】一個喜歡用Python的菜狗在嘗試Linq之後總結的常見用法以及示例

mayoyi發表於2024-08-30

1.篩選 (Where)

篩選集合中的元素。
類似python中列表推導式中的if

示例
int[] numbers = { 1, 2, 3, 4, 5, 6 };
var evenNumbers = numbers.Where(n => n % 2 == 0);

foreach (var num in evenNumbers)
{
    Console.WriteLine(num);
}
// 輸出:2, 4, 6

python中的實現
[ i for i in range(0,99) if i % 2 == 0]

2.投影 (Select)

將集合中的元素對映到新的形式
類似於 Python 列表推導式中的對映。

示例
string[] words = { "apple", "banana", "cherry" };
var wordLengths = words.Select(w => w.Length);

foreach (var length in wordLengths)
{
    Console.WriteLine(length);
}
// 輸出:5, 6, 6

python中的實現
[len(word) for word in ["apple", "banana", "cherry"]]

3.排序 (OrderBy, OrderByDescending)

對集合進行升序或降序排序
類似於 Python 中的 sorted()。

OrderBy示例
//僅演示OrderBy,OrderByDescending同理
string[] names = { "Charlie", "Alice", "Bob" };
var sortedNames = names.OrderBy(name => name);

foreach (var name in sortedNames)
{
    Console.WriteLine(name);
}
// 輸出:Alice, Bob, Charlie

python中的實現
sorted(["Charlie", "Alice", "Bob"])

4.聚合 (Aggregate)

透過指定的函式將集合中的元素合併。
類似於 Python 中的 functools.reduce()。

示例
int[] numbers = { 1, 2, 3, 4, 5 };
int sum = numbers.Aggregate((total, next) => total + next);

Console.WriteLine(sum);
// 輸出:15

python的實現
from functools import reduce
reduce(lambda total, next: total + next, [1, 2, 3, 4, 5])

5.分組 (GroupBy)

將集合按某個條件分組。 類似於 Python 中使用 itertools.groupby()。

示例
string[] words = { "apple", "banana", "cherry", "avocado" };
var groupedWords = words.GroupBy(w => w[0]);

foreach (var group in groupedWords)
{
    Console.WriteLine($"Key: {group.Key}");
    foreach (var word in group)
    {
        Console.WriteLine(word);
    }
}
// 輸出:
// Key: a
// apple
// avocado
// Key: b
// banana
// Key: c
// cherry

python的實現

from itertools import groupby

words = ["apple", "banana", "cherry", "avocado"]
grouped_words = {k: list(v) for k, v in groupby(sorted(words), key=lambda w: w[0])}

6.連線 (Join)

連線兩個集合,並返回匹配的元素。 類似於 Python 中使用 zip() 和列表推導式。

示例
var people = new[]
{
    new { Name = "John", CityId = 1 },
    new { Name = "Jane", CityId = 2 },
    new { Name = "Jake", CityId = 1 }
};

var cities = new[]
{
    new { CityId = 1, CityName = "New York" },
    new { CityId = 2, CityName = "Los Angeles" }
};

var peopleInCities = people.Join(
    cities,
    person => person.CityId,
    city => city.CityId,
    (person, city) => new { person.Name, city.CityName }
);

foreach (var personInCity in peopleInCities)
{
    Console.WriteLine($"{personInCity.Name} lives in {personInCity.CityName}");
}
// 輸出:
// John lives in New York
// Jake lives in New York
// Jane lives in Los Angeles

python的實現
people = [
    {"Name": "John", "CityId": 1},
    {"Name": "Jane", "CityId": 2},
    {"Name": "Jake", "CityId": 1}
]

cities = [
    {"CityId": 1, "CityName": "New York"},
    {"CityId": 2, "CityName": "Los Angeles"}
]

people_in_cities = [
    {**person, **city} for person in people for city in cities if person["CityId"] == city["CityId"]
]

7.去重 (Distinct)

移除集合中的重複元素。 類似於 Python 中的 set()。

示例
int[] numbers = { 1, 2, 2, 3, 3, 3, 4 };
var distinctNumbers = numbers.Distinct();

foreach (var num in distinctNumbers)
{
    Console.WriteLine(num);
}
// 輸出:1, 2, 3, 4
python的實現
list(set([1, 2, 2, 3, 3, 3, 4]))

8.獲取集合的前幾個元素 (Take)

獲取集合中的前 N 個元素。 類似於 Python 中的切片操作。

示例
int[] numbers = { 1, 2, 3, 4, 5 };
var firstThree = numbers.Take(3);

foreach (var num in firstThree)
{
    Console.WriteLine(num);
}
// 輸出:1, 2, 3
python

[1, 2, 3, 4, 5][:3]

9.跳過集合的前幾個元素 (Skip)

跳過集合中的前 N 個元素。 類似於 Python 中的切片操作。

示例
int[] numbers = { 1, 2, 3, 4, 5 };
var allButFirstTwo = numbers.Skip(2);

foreach (var num in allButFirstTwo)
{
    Console.WriteLine(num);
}
// 輸出:3, 4, 5

python的實現
[1, 2, 3, 4, 5][2:]

10.合併兩個集合 (Union)

將兩個集合合併,並移除重複項。 類似於 Python 中的集合操作。

示例
int[] numbers1 = { 1, 2, 3 };
int[] numbers2 = { 3, 4, 5 };
var union = numbers1.Union(numbers2);

foreach (var num in union)
{
    Console.WriteLine(num);
}
// 輸出:1, 2, 3, 4, 5

python的實現
set([1, 2, 3]).union([3, 4, 5])

11.檢查是否包含元素 (Contains)

檢查集合中是否包含指定元素。 類似於 Python 中的 in 關鍵字。

示例
int[] numbers = { 1, 2, 3, 4, 5 };
bool hasThree = numbers.Contains(3);

Console.WriteLine(hasThree);
// 輸出:True

python的實現
3 in [1, 2, 3, 4, 5]

相關文章