最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET?中實現(xiàn)?List?集合去重的方法

 更新時間:2026年02月05日 08:50:11   作者:小碼編匠  
DistinctBy方法是.NET 6和.NET7中LINQ 的一個非常實用的新特性,我們在 LINQ 查詢中根據(jù)指定的鍵對集合進行去重,簡化了代碼并提高了開發(fā)效率,本文給大家介紹.NET中快速實現(xiàn)List集合去重的方法,感興趣的朋友跟隨小編一起看看吧

前言

在數(shù)據(jù)處理中,去除集合中的重復(fù)元素是一個常見的需求。.NET 6 和 .NET 7 引入了 DistinctBy 方法,這是一個非常實用的新特性,可以方便地根據(jù)指定的鍵對集合進行去重。

本文將詳細(xì)介紹 DistinctBy 方法的使用,并通過具體的案例來展示其在實際開發(fā)中的應(yīng)用。

正文

1、DistinctBy 方法

DistinctBy 方法允許我們在 LINQ 查詢中根據(jù)某個鍵對集合中的元素進行去重。

這個方法返回一個新的集合,其中只包含根據(jù)指定鍵唯一確定的元素。

方法簽名

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
);

2、基本用法

最簡單的用法是在 LINQ 查詢中直接調(diào)用 DistinctBy 方法,然后處理去重后的集合。

說明

假設(shè)我們有一個用戶列表,我們想要根據(jù)用戶名去除重復(fù)的用戶。

using System.Linq;
class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}
var users = new List<User>
{
    new User { Name = "Alice", Age = 25 },
    new User { Name = "Bob", Age = 32 },
    new User { Name = "Alice", Age = 28 },
    new User { Name = "David", Age = 35 }
};
var distinctUsers = users.DistinctBy(user => user.Name);
foreach (var user in distinctUsers)
{
    Console.WriteLine($"Name: {user.Name}, Age: {user.Age}");
}

輸出結(jié)果:

Name: Alice, Age: 25
Name: Bob, Age: 32
Name: David, Age: 35

過濾前后元素還是保持原有的順序,我們可以查看源碼。

源碼

private static IEnumerable<TSource> DistinctByIterator<TSource, TKey>(IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer)
{
    using IEnumerator<TSource> enumerator = source.GetEnumerator();
?
    if (enumerator.MoveNext())
    {
        var set = new HashSet<TKey>(DefaultInternalSetCapacity, comparer);
        do
        {
            TSource element = enumerator.Current;
            if (set.Add(keySelector(element)))
            {
                yield return element;
            }
        }
        while (enumerator.MoveNext());
    }
}

通過查看源碼,可以看到是利用了 HashSet 去重,元素順序并未被打亂。

在處理集合時,我們經(jīng)常需要去除重復(fù)的元素,同時保持原有的順序。

使用 HashSet 可以高效地實現(xiàn)這一目標(biāo)。

首先將指定的鍵嘗試添加到 HashSet 中,如果添加成功,說明該鍵沒有重復(fù);

如果添加失敗,說明已經(jīng)存在相同的鍵,此元素將被過濾掉。

3、復(fù)雜用法

DistinctBy 方法可以用于更復(fù)雜的去重邏輯,例如根據(jù)多個屬性進行去重。

說明

假設(shè)我們有一個訂單列表,我們想要根據(jù)客戶名稱和訂單金額去除重復(fù)的訂單。

class Order
{
    public int OrderId { get; set; }
    public string CustomerName { get; set; }
    public decimal Amount { get; set; }
}
var orders = new List<Order>
{
    new Order { OrderId = 1, CustomerName = "Alice", Amount = 100.0m },
    new Order { OrderId = 2, CustomerName = "Bob", Amount = 150.0m },
    new Order { OrderId = 3, CustomerName = "Alice", Amount = 100.0m },
    new Order { OrderId = 4, CustomerName = "Charlie", Amount = 120.0m },
    new Order { OrderId = 5, CustomerName = "Bob", Amount = 150.0m }
};
var distinctOrders = orders.DistinctBy(order => (order.CustomerName, order.Amount));
?
foreach (var order in distinctOrders)
{
    Console.WriteLine($"Order ID: {order.OrderId}, Customer: {order.CustomerName}, Amount: {order.Amount}");
}

輸出結(jié)果:

Order ID: 1, Customer: Alice, Amount: 100.0
Order ID: 2, Customer: Bob, Amount: 150.0
Order ID: 4, Customer: Charlie, Amount: 120.0

4、性能考慮

DistinctBy 方法在內(nèi)部使用哈希表來跟蹤已經(jīng)出現(xiàn)的鍵,因此在大多數(shù)情況下性能非常好。但在處理非常大的數(shù)據(jù)集時,仍然需要注意內(nèi)存使用情況。

說明

假設(shè)我們有一個包含數(shù)百萬條記錄的大集合,我們需要根據(jù)某個鍵進行去重。

var largeCollection = Enumerable.Range(1, 10000000).Select(i => new { Id = i, Value = i % 1000 });
var distinctLargeCollection = largeCollection.DistinctBy(item => item.Value);
Console.WriteLine($"Distinct count: {distinctLargeCollection.Count()}");

5、異步 LINQ 查詢中的使用

DistinctBy 方法也可以在異步 LINQ 查詢中使用,結(jié)合 IAsyncEnumerable<T> 類型,處理大量數(shù)據(jù)時更加高效。

說明

假設(shè)我們有一個異步方法返回一個用戶列表,我們想要根據(jù)用戶名去除重復(fù)的用戶。

using System.Net.Http.Json
public async IAsyncEnumerable<User> GetUsersAsync()
{
    var response = await httpClient.GetAsync("https://api.example.com/users");
    var usersJson = await response.Content.ReadAsStringAsync();
    // 使用Json序列化工具解析用戶列表
    var users = JsonSerializer.Deserialize<List<User>>(usersJson);
    foreach (var user in users)
    {
        yield return user;
    }
}
// 使用異步LINQ查詢
var distinctUsers = await GetUsersAsync().DistinctByAsync(user => user.Name).ToListAsync();
?
foreach (var user in distinctUsers)
{
    Console.WriteLine($"Name: {user.Name}, Age: {user.Age}");
}

總結(jié)

DistinctBy 方法是 .NET 6 和 .NET 7 中 LINQ 的一個非常實用的新特性。我們在 LINQ 查詢中根據(jù)指定的鍵對集合進行去重,簡化了代碼并提高了開發(fā)效率。

希望本文能幫助大家更好地理解和利用 .NET 6 和 .NET 7 中 LINQ 的 DistinctBy 方法,從而在項目中發(fā)揮更大的作用。

到此這篇關(guān)于.NET 中快速實現(xiàn) List 集合去重的文章就介紹到這了,更多相關(guān).net list集合去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

且末县| 闽侯县| 密山市| 泾阳县| 西宁市| 奇台县| 阳春市| 阳朔县| 夹江县| 晴隆县| 陆良县| 顺义区| 名山县| 扶绥县| 故城县| 呼图壁县| 得荣县| 阆中市| 涞水县| 墨脱县| 柳州市| 成安县| 安远县| 乳源| 永善县| 大港区| 平湖市| 黄梅县| 高碑店市| 卫辉市| 文化| 慈利县| 奉贤区| 弥勒县| 加查县| 阿尔山市| 石屏县| 三原县| 周至县| 巴中市| 临澧县|