欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > C# LINQ与集合类 数据操作

C# LINQ与集合类 数据操作

2025/2/9 10:26:03 来源:https://blog.csdn.net/visitorcsdn/article/details/145497461  浏览:    关键词:C# LINQ与集合类 数据操作

目录

LINQ语法

过滤数据

投影数据

排序数据

集合操作

聚合操作

分组操作

查找元素

其他操作

常用的集合类

List 

LinkedList 

HashSet

Dictionary

List:动态数组

LinkedList:双向链表

HashSet:唯一无序集合

Dictionary:键值对集合

场景代码示例

总结


集合类和LINQ是 C# 开发者处理数据的核心工具。本文通过一些常用的api简介数据操作。

LINQ语法

定义 

LINQ语法是c#相对其它语言的优势。LINQ (Language Integrated Query) 被定义为一个用于数据查询的功能,它允许开发者通过统一的语法来查询不同类型的数据源,例如集合、数据库等。LINQ 提供了一个集成的查询语言,可以在编译时获得类型检,从而提高代码的可读性和安全性。LINQ 的关键特点包括:

集成查询:LINQ 将查询功能直接集成到 C# 中,而不需要独立的查询语言。这使得查询操作可以像其他编程操作一样嵌入到代码中。

一致的查询模型:无论查询的是集合、数据库、XML 或其他数据源,LINQ 提供了一个一致的查询模型和语法。

强类型和编译时验证:查询条件、投影等都能够在编译时进行类型检查,这减少了运行时错误的风险。

延迟执行:LINQ 查询通常是延迟执行的,只有在实际迭代查询结果时,查询才会被执行。这有助于优化性能,避免不必要的计算。

代码简洁:用简单的方法链实现复杂操作。

通过 LINQ,开发者可以在同一语言中对各种数据源进行复杂的查询操作,显著提高代码的简洁性、可维护性以及开发效率。

常用的方法

示例代码的参数可以简单理解为集合里的某一项,然后进行遍历

过滤数据
方法名功能描述示例代码
Where过滤集合中满足条件的元素numbers.Where(n => n > 5);
OfType<T>过滤出指定类型的元素objects.OfType<int>();

投影数据
方法名功能描述示例代码
Select将集合中的元素映射到新的形式numbers.Select(n => n * 2);
SelectMany将嵌套集合展开并映射students.SelectMany(s => s.Courses);

排序数据
方法名功能描述示例代码
OrderBy按升序排序students.OrderBy(s => s.Age);
OrderByDescending按降序排序students.OrderByDescending(s => s.Age);
ThenBy在 OrderBy 后按另一条件排序students.OrderBy(s => s.Age).ThenBy(s => s.Name);
ThenByDescending在 OrderBy 后按另一条件降序排序students.OrderBy(s => s.Age).ThenByDescending(s => s.Name);

集合操作
方法名功能描述示例代码
Distinct去重numbers.Distinct();
Union合并两个集合并去重numbers1.Union(numbers2);
Intersect取两个集合的交集numbers1.Intersect(numbers2);
Except取两个集合的差集numbers1.Except(numbers2);

聚合操作
方法名功能描述示例代码
Sum求和numbers.Sum();
Average求平均值numbers.Average();
Max求最大值numbers.Max();
Min求最小值numbers.Min();
Count统计元素个数numbers.Count();

分组操作
方法名功能描述示例代码
GroupBy按指定键分组students.GroupBy(s => s.Grade);

查找元素
方法名功能描述示例代码
First返回第一个满足条件的元素numbers.First(n => n > 5);
FirstOrDefault返回第一个满足条件的元素,若无则返回默认值numbers.FirstOrDefault(n => n > 5);
Single返回唯一满足条件的元素numbers.Single(n => n == 5);
SingleOrDefault返回唯一满足条件的元素,若无则返回默认值numbers.SingleOrDefault(n => n == 5);
Last返回最后一个满足条件的元素numbers.Last(n => n > 5);
LastOrDefault返回最后一个满足条件的元素,若无则返回默认值numbers.LastOrDefault(n => n > 5);

其他操作
方法名功能描述示例代码
Any判断集合中是否有满足条件的元素numbers.Any(n => n > 10);
All判断集合中所有元素是否满足条件numbers.All(n => n > 0);
Skip跳过指定数量的元素numbers.Skip(5);
Take获取指定数量的元素numbers.Take(5);
Concat连接两个集合numbers1.Concat(numbers2);
Reverse反转集合numbers.Reverse();

常用的集合类

操作方法

List<T> 

List<T> 是动态数组,提供了丰富的操作方法。

方法名功能描述示例代码
Add添加一个元素到列表末尾list.Add(10);
AddRange添加一个集合到列表末尾list.AddRange(new[] { 20, 30 });
Insert在指定索引处插入一个元素list.Insert(1, 40);
Remove移除第一个匹配的元素list.Remove(10);
RemoveAt移除指定索引处的元素list.RemoveAt(2);
RemoveRange移除指定范围的元素list.RemoveRange(0, 2);
Clear清空列表list.Clear();
Contains判断列表是否包含某个元素list.Contains(10);
IndexOf查找元素的索引list.IndexOf(10);
Find查找第一个匹配的元素list.Find(x => x > 5);
FindAll查找所有匹配的元素list.FindAll(x => x > 5);
Sort对列表进行排序list.Sort();
Reverse反转列表list.Reverse();
Count获取列表的元素数量list.Count;
ToArray将列表转换为数组list.ToArray();

LinkedList<T> 

LinkedList<T> 是双向链表,适合频繁插入和删除操作。

方法名功能描述示例代码
AddFirst在链表头部插入一个元素linkedList.AddFirst(10);
AddLast在链表尾部插入一个元素linkedList.AddLast(20);
AddBefore在指定节点前插入一个元素linkedList.AddBefore(linkedList.First, 30);
AddAfter在指定节点后插入一个元素linkedList.AddAfter(linkedList.First, 40);
RemoveFirst移除链表头部的元素linkedList.RemoveFirst();
RemoveLast移除链表尾部的元素linkedList.RemoveLast();
Remove移除第一个匹配的元素linkedList.Remove(10);
Clear清空链表linkedList.Clear();
Contains判断链表是否包含某个元素linkedList.Contains(10);
Count获取链表的元素数量linkedList.Count;
First获取链表的第一个节点linkedList.First;
Last获取链表的最后一个节点linkedList.Last;

HashSet<T>

HashSet<T>无序唯一的集合,适合需要快速查找、插入和删除的场景。

方法名功能描述示例代码
Add添加一个元素,若已存在则返回 falsehashSet.Add(10);
Remove移除指定元素hashSet.Remove(10);
Clear清空集合hashSet.Clear();
Contains判断集合是否包含指定元素hashSet.Contains(10);
UnionWith并集操作hashSet.UnionWith(otherSet);
IntersectWith交集操作hashSet.IntersectWith(otherSet);
ExceptWith差集操作hashSet.ExceptWith(otherSet);
SymmetricExceptWith对称差集操作(只保留不重叠的元素)hashSet.SymmetricExceptWith(otherSet);
Count获取集合的元素数量hashSet.Count;

Dictionary<TKey, TValue>

Dictionary<TKey, TValue> 是键值对集合,支持通过键快速查找值。

方法名功能描述示例代码
Add添加一个键值对dict.Add("key1", "value1");
Remove移除指定键的键值对dict.Remove("key1");
Clear清空字典dict.Clear();
ContainsKey判断字典是否包含指定键dict.ContainsKey("key1");
ContainsValue判断字典是否包含指定值dict.ContainsValue("value1");
TryGetValue尝试获取指定键的值,返回是否成功dict.TryGetValue("key1", out string value);
Keys获取所有键的集合dict.Keys;
Values获取所有值的集合dict.Values;
Count获取字典的元素数量dict.Count;

方法示例 

List<T>:动态数组

使用场景:元素频繁增删改查,但不要求唯一性。

// 创建并添加元素
List<string> list = new List<string> { "Apple", "Banana" };
list.Add("Cherry");  // 添加到末尾// 删除元素
list.Remove("Banana");     // 删除第一次出现的元素
list.RemoveAt(0);          // 删除索引位置元素// 遍历(LINQ格式)
list.ForEach(fruit => Console.WriteLine(fruit)); 
LinkedList<T>:双向链表

使用场景:频繁在两端的插入/删除操作。

LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddLast(10);     // 尾部添加
linkedList.AddFirst(20);    // 头部添加LinkedListNode<int> node = linkedList.Find(10);
linkedList.AddAfter(node, 15);  // 在节点后插入新值linkedList.RemoveFirst();  // 删除头节点
HashSet<T>:唯一无序集合

使用场景:去重、集合运算(并集/交集)。

HashSet<int> setA = new HashSet<int> { 1, 2, 3 };
HashSet<int> setB = new HashSet<int> { 3, 4, 5 };setA.UnionWith(setB);          // 并集:1, 2, 3, 4, 5
setA.IntersectWith(setB);      // 交集:3
setA.ExceptWith(setB);         // 差集:1, 2bool contains = setA.Contains(3); // 检查是否包含
Dictionary<TKey, TValue>:键值对集合

使用场景:高效查找(通过键)、存储复杂数据。

Dictionary<string, int> ages = new Dictionary<string, int>
{{ "Alice", 25 },{ "Bob", 30 }
};ages["Charlie"] = 35;          // 添加新键值对
ages.Remove("Bob");            // 删除键值对if (ages.ContainsKey("Alice")) // 检查键是否存在
{int age = ages["Alice"];    // 通过键获取值
}

场景代码示例

从列表中筛选并排序

var students = new List<Student>
{new Student { Name = "Alice", Age = 20 },new Student { Name = "Bob", Age = 22 },new Student { Name = "Charlie", Age = 19 }
};var result = students.Where(s => s.Age >= 20) // 筛选年龄 >= 20 的学生.OrderBy(s => s.Age)      // 按年龄升序排序.Select(s => s.Name);     // 投影名字

统计字符串中每个单词的出现次数

string text = "Hello world! Hello C#!";
var wordCounts = text.Split(' ').GroupBy(word => word).Select(group => new { Word = group.Key, Count = group.Count() });
foreach (var word in wordCounts)
{Console.WriteLine($"{word.Word}: {word.Count}");
}

使用 Dictionary 和 LINQ 实现缓存

Dictionary<int, string> cache = new Dictionary<int, string>();
cache[1] = "Value1";
cache[2] = "Value2";var cachedKeys = cache.Keys.Where(key => key % 2 == 0); // 查找偶数键

总结

集合类和 LINQ 不仅简化了数据的存储和查询,还极大地提升了代码的可读性和开发效率。掌握集合类和 LINQ 能够编写更高效、更易维护的代码。如何高效地管理和处理数据,是每个开发者都需要面对的关键问题。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com