C#泛型集合和非泛型集合的异同点及声明方式

C#中的集合是用于存储和操作一组相关数据的数据结构C#提供了泛型集合和非泛型集合两种类型。

命名空间:

非泛型集合 System.Collections

泛型集合   System.Collections.Generic

列表和字典中分泛型集合与非泛型集合。

列表中非泛型集合为ArrayList,泛型集合为List<T>。字典中非泛型集合为Hashtable,泛型集合为Dictionary<TKey, TValue>。中非泛型集合为Stack,泛型集合为Stack<T>;队列中非泛型集合为Quene,泛型集合为Quene<T>;对于列表存取和输出都是有序的,字典的存取和输出都是无序的,栈中数据先进后出,队列中数据先进先出。

1.非泛型集合:

非泛型集合使用Object类型来存储元素。常见的非泛型集合有ArrayList、Hashtable,栈Stack,队列Quene等。

ArrayList是一种动态数组,它可以根据需要自动调整大小。它可以存储任意类型的对象,并且可以通过索引访问和操作元素。ArrayList提供了一系列方法来添加、删除、查找和修改元素,使得对列表的操作更加方便。

Hashtable是一种键值对存储结构,也被称为哈希表。它使用键来访问和存储值,通过将键映射到哈希表中的位置来实现快速的查找和插入操作。Hashtable中的键和值都可以是任意类型的对象。它提供了一系列方法来添加、删除、查找和修改键值对,使得对哈希表的操作更加方便。

Stack是一种后进先出(Last In First Out, LIFO)的数据结构,意味着最后添加的元素将是第一个被移除的元素。压栈push()添加元素;弹栈Pop(),读取并移除顶部对象;Peek()读栈顶 读取但不移除对象

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

///summary
///字典(Hashtable) 非泛型
///summary
public class HashtableText : MonoBehaviour
{
    private Hashtable table = new Hashtable();  //非泛型
    void Start()
    {
        table.Add("姓名", "Kami");
        table.Add("Sex", "Boy");
        table.Add("Age", 18);
        foreach (string item in table.Keys)
        {
            print("键:" + item +" "+ "值:" + table[item]);
        }
        foreach (string item in table.Values)
        {
            print("值:" + item);
        }
    }


定义非泛型集合的方式如下:

//列表
ArrayList list = new ArrayList();
list.Add("CSDN");
list.Add(2021);

//字典Hashtable
Hashtable table=new Hashtable();
table.Add("姓名", "Kami");
table.Add("Sex", "Boy");
table.Add("Age", 18);

//栈Stack
//Stack(先进后出)泛型集合定义格式
Stack<String> stack = new Stack<>();
stack.push("Hello");
stack.push("World");
String poppedElement = stack.pop();

//队列Quene
Queue queue = new LinkedList();
queue.Enqueue("Kami");      //入队
queue.Enqueue(20);          
print(queue.Dequeue());     //出队
print(queue.Peek());        //读队首

非泛型缺点:

1.性能不好,因为可能发生装箱。

2.类型不安全,可能会发生类型转换的异常。

3.使用不方便,用的时候需要手动做类型转换。

由于使用了Object类型,需要进行装箱和拆箱操作,会带来性能损耗。同时,编译器无法在编译时进行类型检查,容易引发类型转换错误。

优点:可以存储不同类型的元素,灵活性较高。

2.泛型集合

泛型集合使用泛型类型参数来指定存储的元素类型。常见的泛型集合有List<T>、Dictionary<TKey, TValue>等。

 `List<T>` 和 `Dictionary<TKey, TValue>` 它们分别用于存储集合和键值对数据。

1. **List<T>**:这是一个泛型集合,用于存储一个对象的有序集合。在这个集合中,每个元素都是同一类型的对象,这个类型在声明 List 时使用尖括号 `<>` 指定。例如,`List<string>` 用于存储字符串的集合,`List<int>` 用于存储整数的集合。`List<T>` 提供了许多方法来添加、删除、查找和访问集合中的元素,例如 `Add`、`Remove`、`Find` 和 `ForEach` 等。

   List<int> numbers = new List<int>();
   numbers.Add(1); // 添加元素
   numbers.Add(2);
   numbers.Add(3);
   int firstNumber = numbers[0]; // 访问第一个元素

2. **Dictionary<TKey, TValue>**:这是一个泛型键值对集合,用于存储键值对的无序集合。在这个集合中,每个元素都是一个键(Key)和一个值(Value)的对应关系。键和值可以是不同的类型,它们在声明 Dictionary 时分别用两个尖括号指定。`Dictionary<TKey, TValue>` 提供了快速的查找、添加和删除键值对的能力,常用的方法有 `Add`、`Remove`、`TryGetValue` 和 `ContainsKey` 等。

Dictionary<string, int> ages = new Dictionary<string, int>();
   ages.Add("Alice", 25); // 添加键值对
   ages.Add("Bob", 30);
   int age;
   if (ages.TryGetValue("Alice", out age)) // 尝试获取键对应的值
   {
       Console.WriteLine("Alice is " + age + " years old.");
   }

这两种数据结构都是.NET Framework中的System.Collections.Generic命名空间下的一部分,广泛应用于各种类型的应用程序中,以便于开发者能够有效地管理和操作数据集合。

定义泛型集合的方式如下:

//List<T>  列表
List<string> list = new List<string>();
list.Add("CSDN");
list.Add("2021");


//Dictionary<Tkey,Tvalue>  字典
   Dictionary<string, int> ages = new Dictionary<string, int>();
   ages.Add("Alice", 25); // 添加键值对
   ages.Add("Bob", 30);
   int age;
   if (ages.TryGetValue("Alice", out age)) // 尝试获取键对应的值
   {
       Console.WriteLine("Alice is " + age + " years old.");
   }

//Stack<T> 栈
Deque<String> stack = new ArrayDeque<>();
stack.push("Hello");
stack.push("World");
String poppedElement = stack.pop();

//Quene<T> 队列
Queue<String> queue = new LinkedList<>();
queue.Enqueue("Kami");      //入队
queue.Enqueue("90");          
print(queue.Dequeue());     //出队
print(queue.Peek());        //读队首
  • 优点:由于使用了泛型类型参数,可以在编译时进行类型检查,提高了代码的安全性和性能。
  • 缺点只能存储指定类型的元素,不具备存储不同类型元素的灵活性。
  • 35
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#集合List是一种可以存储任意类的动态数组,它位于System.Collections.Generic命名空间下。语法如下:List<T> listName = new List<T>(); 其中T代表参数,可以是任意有效的C#数据类。(引用) List集合可以通过add方法逐个添加元素,也可以使用AddRange方法将另一个List集合添加到当前集合中。例如,可以创建两个List<int>对象,一个用于存储偶数,一个用于存储奇数,然后将奇数集合添加到偶数集合中,并通过foreach循环遍历输出集合中的元素。代码如下(引用): ```csharp int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; List<int> listEven = new List<int>(); List<int> listOdd = new List<int>(); foreach (int num in nums) { if (num % 2 == 0) { listEven.Add(num); } else { listOdd.Add(num); } } listEven.AddRange(listOdd); foreach (int item in listEven) { Console.Write(item + " "); } Console.ReadKey(); ``` 使用集合List的一个好处是可以避免频繁的类转换。通过指定参数,我们可以直接在集合中存储特定类的对象,而无需进行繁琐的类转换。这样可以提高代码的可读性和效率。(引用)<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C#中List用法,必知必会!](https://blog.csdn.net/qq_44034384/article/details/106312390)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [c#List集合](https://blog.csdn.net/linxianming_/article/details/125979400)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值