C#集合--数组

Array类是所有一维和多维数组的隐式基类,同时也是实现标准集合接口的最基本的类型。Array类实现了类型统一,因此它为所有数组提供了一组通用的方法,不论这些数组元素的类型,这些通用的方法均适用。

正因为数组如此重要,所以C#为声明数组和初始化数组提供了明确的语法。在使用C#语法声明一个数组时,CLR隐式地构建Array类--合成一个伪类型以匹配数组的维数和数组元素的类型。而且这个伪类型实现了generic集合接口,比如IList<string>接口。

CLR在创建数组类型实例时会做特殊处理--在内存中为数组分配连续的空间。这就使得索引数组非常高效,但这却阻止了对数组的修改或调正数组大小。

Array类实现了IList<T>接口和IList接口。Array类显示地实现了IList<T>接口,这是为了保证接口的完整性。但是在固定长度集合比如数组上调用IList<T>接口的Add或Remove方法时,会抛出异常(因为数组实例一旦声明之后,就不能更改数组的长度)。Array类提供了一个静态的Resize方法,使用这个方法创建一个新的数组实例,然后复制当前数组的元素到新的实例。此外,在程序中,当在任何地方引用一个数组都会执行最原始版本的数组实例。因此如果希望集合大小可以调整,那么你最好使用List<T>类。

数组元素可以是值类型也可以是引用类型。值类型数组元素直接存在数组中,比如包含3个整数的数组会占用24个字节的连续内存。而引用类型的数组元素,占用的空间和一个引用占用的空间一样(32位环境中4个字节,64为环境中8个字节)。我们先来看下面的代码:

int[] numbers =new int[3];
numbers[0] =;
numbers[1] = 7;

StringBuilder[] builders = new StringBuilder[5];
builders[0] = new StringBuilder("Builder1");
builders[1] = new StringBuilder("Builder2");
builders[2] = new StringBuilder("Builder3");

对应的内存分配变化如下面几张图所示:

image

执行完int[] numbers=new int[3]之后,在内存中分配了8×3=24个字节,每个字节都为0。

image

执行完numbers[0]=1之后,数组声明后的第一个8字节变为00 00 00 01。

image 

同样地,执行完numbers[1]=7之后,第二段8个字节变为00 00 00 07。

对应引用类型的数组,我们用一张图来说明内存分配:

image

看起来分复杂,其实内存分配示意图如下

image

 

通过Clone方法可以克隆一个数组,比如arrayB = arrayA.Clone()。但是,克隆数组执行浅拷贝,也就是说数组自己包含的那部分内容才会被克隆。简单说,如果数组包含的是值类型对象,那么克隆了这些对象的值。而数组的子元素是引用类型,那么仅仅克隆引用类型的地址。

StringBuilder[] builders2 = builders;
ShtringBuilder[] shallowClone = (StringBuilder[])builders.Clone();

与之对应的内存分配示意图:

image

如果需要执行深拷贝,即克隆引用类型的子对象;那么你需要遍历数组并手动的克隆每个数组元素。深克隆规则也适用于.NET其他集合类型。

尽管数组在设计时,主要使用32位的索引,它也在一定程度上支持64位索引,这需要使用那些既接收Int32又接收Int64类型参数的方法。这些重载方法在实际中并没有意义,因为CLR不允许任何对象--包括数组在内--的大小超过2G(无论32位的系统还是64位的系统)

 

构造数组和索引数组

创建数组和索引数组的最简单方式就是通过C#语言的构建器

Int[] myArray={1,2,3};
int first=myArray[0];
int last = myArray[myArray.Length-1];

或者,你可以通过调用Array.CreateInstance方法动态地创建一个数组实例。你可以通过这种方式指定数组元素的类型和数组的维度。而GetValue和SetValue方法允许你访问动态创建的数组实例的元素。

Array a = Arrat.CreateInstance(typeof(string), 2);
a.SetValue('hi", 0);
a.SetValue("there",1);
string s  = (string)a.getValue(0);

string[] cSharpArray = (string[])a;
string s2  = cSharpArray[0];

动态创建的零索引的数组可以转换为一个匹配或兼容的C#数组。比如,如果Apple是Fruit的子类,那么Apple[]可以转换成Fruit[]。这也是为什么object[]没有作为统一的数组类型,而是使用Array类;答案在于object[]不仅与多维数组不兼容,而且还与值类型数组不兼容。因此我们使用Array类作为统一的数组类型。

GetValue和SetValue对编译器生成的数组也起作用,若想编写一个方法处理任何类型的数组和任意维度的数组,那么这两个方法非常有用。对于多维数组,这两个方法可以把一个数组当作索引参数。

public object GetValue(params int[] indices)
public void SetValue(object value, params int[] indices)

下面的方法在屏幕打印任意数组的第一个元素,无论数组的维度

void WriteFirstValue (Array a)
{
Console.Write (a.Rank + "-dimensional; ");
 
int[] indexers = new int[a.Rank];
Console.WriteLine ("First value is " + a.GetValue (indexers));
}
void Demo()
{
int[] oneD = { 1, 2, 3 };
int[,] twoD = { {5,6}, {8,9} };
WriteFirstValue (oneD); // 1-dimensional; first value is 1
WriteFirstValue (twoD); // 2-dimensional; first value is 5
}

在使用SetValue方法时,如果元素与数组类型不兼容,那么会抛出异常。

无论采取哪种方式实例化一个数组之后,那么数组元素自动初始化了。对于引用类型元素的数组而言,初始化数组元素就是把null值赋给这些数组元素;而对于值类型数组元素,那么会把值类型的默认值赋给数组元素。此外,调用Array类的Clear方法也可以完成同样的功能。Clear方法不会影响数组大小。这和常见的Clear方法(比如ICollection<T>.Clear方法)不一样,常见的Clear方法会清除集合的所有元素。

 

遍历数组

通过foreach语句,可以非常方便地遍历数组:

int[] myArray = { 1, 2, 3};
foreach (int val in myArray)
    Console.WriteLine (val);

你还可以使用Array.ForEach方法来遍历数组

public static void ForEach<T> (T[] array, Action<T> action);

该方法使用Action代理,此代理方法的签名是(接收一个参数,不返回任何值):

public delegate void Action<T> (T obj);

下面的代码显示了如何使用ForEach方法

Array.ForEach (new[] { 1, 2, 3 }, Console.WriteLine);

你可能会很好奇Array.ForEach是如何执行的,它就是这么执行的

public static void ForEach<T>(T[] array, Action<T> action) {
    if( array == null) {
        throw new ArgumentNullException("array");
    }

    if( action == null) {
        throw new ArgumentNullException("action");
    }
    Contract.EndContractBlock();

    for(int i = 0 ; i < array.Length; i++) {
        action(array[i]);
    }
}

在内部执行for循环,并调用Action代理。在上面的实例中,我们调用Console.WriteLine方法,所以可以在屏幕上输出1,2,3。

 

获取数组的长度和维度

Array提供了下列方法或属性以获取数组的长度和数组的维度:

public int GetLength (int dimension);
public long GetLongLength (int dimension);

public int Length { get; }
public long LongLength { get; }

public int GetLowerBound (int dimension);
public int GetUpperBound (int dimension);

public int Rank { get; }
GetLength和GetLongLength返回指定维度的长度(0表示一维数组),Length和LongLength返回数组中所有元素的总数(包含了所有维度)。

GetLowerBound和GetUpperBound对于多维数组非常有用。GetUpperBound返回的结果等于指定维度的GetLowerBound+指定维度的GetLength

 

搜索数组

Array类对外提供了一系列方法,以在一个维度中查找元素。比如:

  • BinarySearch方法:在一个排序后的数组中快速找到指定元素;
  • IndexOf/LastIndex方法:在未排序的数组中搜索指定元素;
  • Find/FindLast/FindIndex/FindLastIndex/FindAll/Exists/TrueForAll方法:根据指定的Predicated<T>(代理)在未排序的数组中搜索一个或多个元素。

如果没有找到指定的值,数组的这些搜索方法不会抛出异常。相反,搜索方法返回-1(假定数组的索引都是以0开始),或者返回generic类型的默认值(int返回0,string返回null)。

二进制搜索速度很快,但是它仅仅适用于排序后的数组,而且数组的元素是根据大小排序,而不是根据相等性排序。正因为如此,所以二进制搜索方法可以接收IComparer或IComparer<T>对象以对元素进行排序。传入的IComparer或IComparer<T>对象必须和当前数组所使用的排序比较器一致。如果没有提供比较器参数,那么数组会使用默认的排序算法。

IndexOf和LastIndexOf方法对数组进行简单的遍历,然后根据指定的值返回第一个(或最后一个)元素的位置。

以断定为基础(predicate-based)的搜索方法接受一个方法代理或lamdba表达式判断元素是否满足“匹配”。一个断定(predicate)是一个简单的代理,该代理接收一个对象并返回bool值:

public delegate bool Precicate<T>(T object);

下面的例子中,我们搜索字符数组中包含字母A的字符:

static void Main(string[] args)
{
    string[] names = { "Rodney", "Jack", "Jill" };
    string match = Array.Find(names, ContainsA);
    Console.WriteLine(match);

    Console.ReadLine();
}

static bool ContainsA(string name)
{
    return name.Contains("a");
}

上面的代码可以简化为:

static void Main(string[] args)
{
    string[] names = { "Rodney", "Jack", "Jill" };
    string match = Array.Find(names, delegate(string name) { return name.Contains("a"); });
    Console.WriteLine(match);

    Console.ReadLine();
}

如果使用lamdba表达式,那么代码还可以更简洁:

static void Main(string[] args)
{
    string[] names = { "Rodney", "Jack", "Jill" };
    string match = Array.Find(names, name=>name.Contains("a"));
    Console.WriteLine(match);

    Console.ReadLine();
}

FindAll方法则从数组中返回满足断言(predicate)的所有元素。实际上,该方法等同于Enumerable.Where方法,只不过数组的FindAll是从数组中返回匹配的元素,而Where方法从IEnumerable<T>中返回。

如果数组成员满足指定的断言(predicate),那么Exists方法返回True,该方法等同于Enumerable.Any方法。

所以数组的所有成员都满足指定的断言(predicate),那么TrueForAll方法返回True,该方法等同于Enumerable.All方法。

 

对数组排序

数组有下列自带的排序方法:

public static void Sort<T>(T[] array);
public static void Sort(Array array);
public static void Sort(TKey, TValue)(TKey[] keys, TValue[] items);
public static void Sort(Array keys[], Array items);

上面的方法都有重载的版本,重载方法接受下面这些参数:

  • int index,从指定索引位置开始排序
  • int length,从指定索引位置开始,需要排序的元素的个数
  • ICompare<T> comparer,用于排序决策的对象
  • Comparison<T> comparison,用于排序决策的代理

下面的代码演示了如何实现一个简单的排序:

static void Main(string[] args)
{
    int[] numbers = { 3,2,1};
    Array.Sort(numbers);
    foreach (int number in numbers)
        Console.WriteLine(number);

    Console.ReadLine();
}

Sort方法还可以接收两个两个数组类型的参数,然后基于第一个数组的排序结果,对每个数组的元素进行排序。下面的例子中,数字数组和字符数组都按照数字数组的顺序进行排序。

static void Main(string[] args)
{
    int[] numbers = { 3,2,1};
    string[] names = { "C", "B", "E" };
    Array.Sort(numbers, names);
    foreach (int number in numbers)
        Console.WriteLine(number); // 1, 2,3

    foreach (string name in names)
        Console.WriteLine(name); // E, B, C

    Console.ReadLine();
}

Array.Sort方法要求数组实现了IComparer接口。这就是说C#的大多数类型都可以排序。如果数组元素不能进行比较,或你希望重载默认的排序,那么你需要在调用Sort方法时,需提供自定义的Comparison。所以自定义排序算法有下面两种实现方式:

1)通过一个帮助对象实现IComparer或IComparer<T>接口

public static void Sort(Array array, IComparer comparer)
public static void Sort<T>(T[] array, System.Collections.Generic.IComparer<T> comparer)

2)通过Comparison接口

public static void Sort<T>(T[] array, Comparison<T> comparison)

Comparison代理遵循IComparer<T>.CompareTo语法:

public delegate int Comparison<T> (T x, T y);
如果x的位置在y之前,那么返回-1;如果x在y之后,返回1,如果位置相同,那么返回0。

我们来看一下Array的Sort<T>(T[]array, Comparison<T> comparison)方法的源代码:

public static void Sort<T>(T[] array, Comparison<T> comparison) {
    ......

    IComparer<T> comparer = new FunctorComparer<T>(comparison);
    Array.Sort(array, comparer);
}

由此,可内部,Comparison<T>转换成IComparer<T>,因此在实际中,需要实现自定义排序时,如果需要考虑性能,那么推荐使用第一种方式。此外,我们分析Sort<T>(T[] array, System.Collections.Generic.IComparer<T> comparer)的源代码,

public static void Sort<T>(T[] array, int index, int length, System.Collections.Generic.IComparer<T> comparer)
{
    ...

    if (length > 1)
    {
        if (comparer == null || comparer == Comparer<T>.Default)
        {
            if (TrySZSort(array, null, index, index + length - 1))
            {
                return;
            }
        }

        ArraySortHelper<T>.Default.Sort(array, index, length, comparer);
    }
}

我们可以看到,首先尝试调用调用非托管代码的Sort方法,如果成功排序,直接返回。否则调用非托管代码(C#的ArraySortHelper)的Sort方法进行排序:

public void Sort(T[] keys, int index, int length, IComparer<T> comparer)
{
    …
try { if (comparer == null) { comparer = Comparer<T>.Default; } if (BinaryCompatibility.TargetsAtLeast_Desktop_V4_5) { IntrospectiveSort(keys, index, length, comparer); } else { DepthLimitedQuickSort(keys, index, length + index - 1, comparer, IntrospectiveSortUtilities.QuickSortDepthThreshold); } } catch (IndexOutOfRangeException) { IntrospectiveSortUtilities.ThrowOrIgnoreBadComparer(comparer); } catch (Exception e) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_IComparerFailed"), e); } }

如果有兴趣,可以继续分析IntrospectiveSort方法和DepthLimitedQuickSort,不过MSDN已经给出了总结,

image

意识是说,排序算法有三种:

  • 如果分区大小小于16,那么使用插入排序算法
  • 如果分区的大小超过2*LogN,N是数组的范围,那么使用堆排序
  • 其他情况,则使用快排

 

反转数组的元素

使用下面的方法,可以反转数组的所有元素或部分元素

public static void Reverse (Array array);
public static void Reverse (Array array, int index, int length);

如果你在乎性能,那么请不要直接调用Array的Reverse方法,而是应该创建一个自定义的RerverseComparer。比如下面的例子中,调用Array.Reverse和CustomReverse在我的电脑上两者的性能高差距为20%左右

class Program
{
    static void Main(string[] args)
    {
        int seeds = 100000;

        Staff[] staffs = new Staff[seeds];
        Random r = new Random();
        for (int i = 0; i < seeds; i++)
            staffs[i] = new Staff { StaffNo = r.Next(1, seeds).ToString() };


        ArrayReverse(staffs); 
        CustomReverse(staffs); 

        Console.ReadLine();
    }

    static void ArrayReverse(Staff[] staffs)
    {
        DateTime t1 = DateTime.Now;
        Array.Sort(staffs);
        Array.Reverse(staffs);
        DateTime t2 = DateTime.Now;
        Console.WriteLine("Array Reverse: " + (t2 - t1).Milliseconds + "ms");
    }

    static void CustomReverse(Staff[] staffs)
    {
        DateTime t1 = DateTime.Now;
        Array.Sort(staffs, new StaffComparer());
        DateTime t2 = DateTime.Now;
        Console.WriteLine("Custom Reverse: " + (t2 - t1).Milliseconds + "ms");
    }

    internal class Staff : IComparable
    {
        public string StaffNo { get; set; }
        public string Name { get; set; }

        public int CompareTo(object obj)
        {
            Staff x = obj as Staff;

            return this.StaffNo.CompareTo(x.StaffNo);
        }
    }

    internal class StaffComparer : IComparer<Staff>
    {
        public int Compare(Staff x, Staff y)
        {
            return y.StaffNo.CompareTo(x.StaffNo);
        }
    }
}

执行结果:

image

 

复制数组

Array提供了四个方法以实现浅拷贝:Clone,CopyTo,Copy和ConstrainedCopy。前两个方法是实例方法,后面两个是静态方法。

Clone方法返回一个全新的(浅拷贝)数组 。CopyTo和Copy方法复制数组的连续子集。复制一个多维矩形数组需要你的多维索引映射到一个线性索引。比如,一个3×3的数组position,那么postion[1,1]对应的线性索引为1*3+1=4。原数组和目标数组的范围可以交换,不会带来任何问题。

ConstrainedCopy执行原子操作,如果所要求的元素不能全部成功地复制,那么操作回滚。

Array还提供AsReadOnly方法,它返回一个包装器,以防止数组元素的值被更改。

最后,Clone方法是由外部的非托管代码实现

protected extern Object MemberwiseClone()

同样地,Copy,CopyTo, ConstraintedCopy也都是调用外部实现

internal static extern void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable);

 

转换数组和缩减数组大小

Array.ConvertAll创建并返回一个类型为TOutput的新数组,调用Converter代理以复制元素到新的数组中。Converter的定义如下:

public delegate TOutput Converter<TInput,TOutput>(TInput input)

下面的代码展示了如果把一个浮点数数组转换成int数组

float[] reals = { 1.3f, 1.5f, 1.8f };

int[] wholes = Array.ConvertAll(reals, f => Convert.ToInt32(f));

foreach (int a in wholes)
    Console.WriteLine(a);  //->1,2,2
Resize方法创建一个新数组,然后复制元素到新数组,然后返回新数组;原数组不发生改变。

转载于:https://www.cnblogs.com/yang_sy/p/3601121.html

C# 集合与数组 1.什么是集合(ArryList): 能够随便放各种类型的数据,存储一组数据对象,并在数组的基础上进行封装元素的操作方法;表示可以通过遍历每个元素的方法来访问一组数据或对象。(可以看成,长度可变,具有很多方法的数组)。 2.集合与数组的区别 (1) 集合比较灵活,不限长度; (2) 如果创建数组,那么是固定的,无法改变容量大小,必须在使用的时候声明大小; (3) 数组存放类型只... 阅读详情

相关推荐

第壹章第6节 C#和TS语言对比-数组集合

本节比较长,但可以让我们一次性彻底掌握数组集合。编程的很大一部分工作,是访问和操作数据,而其中使用频率最高的数据形式,就是数组集合。C#毕竟是后端语言,所以提供了更加丰富的集合类型,而且还有非常非常非常强大的LINQ查询语法,而TS就相对简陋些,毕竟是前端语言。文末补充了元组,这玩意我很少用,具体原因详见正文...

2401_85195613的博客 1235

C# 各类集合用法汇总【全面示例各种方法】

1、ArrayList 2、泛型List ,获取集合中元素的个数,复制集合中的元素数据,装入新的集合当 Item( ) 通过指定索引获取或设置元素。对于List类来说,它是一个索引器。 Add( ) 在List中 中,将al集合的元素对象拷贝到数组copyArray中,遍历ArrayList, 3、LinkedList 4、Queue 5、Stack Set类型集合 6、HashSet 7、SortedSet 8、Hashtable: 9、Dictionary: 10、SortedDictionary:

这个人好有趣....hh 4233

银河麒麟V10+QT6.0中文输入法环境搭建全攻略(附镜像加速技巧)

本文提供了在银河麒麟V10操作系统上为QT6.0搭建中文输入法环境的完整实战指南。文章详细介绍了从系统准备、镜像源优化、QT6安装器获取与加速安装,到编译Fcitx5输入法插件依赖库、深度配置环境变量与项目的全流程。重点分享了使用国内镜像源加速安装的技巧,解决了国产化开发中QT应用无法输入中文的常见难题,旨在帮助开发者快速构建稳定高效的开发环境。

weixin_29204749的博客 394

C#学习——集合——Array数组

Array数组介绍

2261

Hadoop生态系统-新手快速入门(含HDFS、HBase系统架构)

Hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量...

Hadoop环境搭建教程 472

SECS/GSM 测试工具 SecsExpress 的配置与实战应用

本文详细介绍了半导体设备通讯测试工具SecsExpress的配置与实战应用。作为专业的SECS/GSM协议调试工具,它能模拟Host与设备端进行双向测试,帮助工程师快速部署、验证通讯链路,并高效排查与RMS系统或真实设备间的联调问题,是提升半导体工厂设备集成与维护效率的利器。

yhn456789的博客 298

C# 数组集合

一、数组     1、变量是程序运行是在内存中存储发生变化的容器;     2、变量可以存储单个数据,而数组可以存储多个变量,并且互不影响,和谐共处;     3、数组的特点:长度固定、类型相同;     4、数组用于存储长度固定,类型相同变量的容器 二、数组的分类:     一维数组、二维数组、多维数组、不规则数组 三、数组的应用:     创建、赋值、应用 四、声明...

banzhi4057的博客 448

电赛备赛笔记:用STM32驱动AD9959信号发生器模块,从接线到出波保姆级教程

本文详细介绍了如何使用STM32驱动AD9959信号发生器模块,从硬件接线到软件调试的全流程。AD9959作为高性能DDS芯片,适用于电子设计竞赛中的信号生成需求。文章包含硬件连接指南、寄存器配置解析、多通道控制技巧以及常见问题解决方案,帮助参赛者快速掌握AD9959的应用。

weixin_31858171的博客 367

C# 数组及集合

集合

钢铁男儿 502

从DCI-P3到sRGB:跨媒体色彩转换的矩阵奥秘与实践

本文深入解析从DCI-P3到sRGB的色彩空间转换技术,揭示矩阵运算的核心原理与实践技巧。通过实战案例展示如何正确处理白点差异、伽马曲线转换等关键环节,帮助影视从业者解决跨媒体色彩匹配问题,确保作品在不同设备上呈现一致的视觉效果。

weixin_28709649的博客 328

交通银行金融科技后端开发实习生面试经验

笔试之路的第一个脚印。不足的地方:基本功不扎实,得补。先补sql(先整理出一篇sql语句做题的文章,争取下次笔试拿下这一块),编程题中的SQL写不出来感觉很丢人。然后补八股文,结合一些网上项目教程,来理解常用的一些八股文(比如各种锁)。

T__TSZ的博客 1728

C#之数组与集合

数组 数组是大部分编程语言中都支持的一种数据类型,无论C语言、C++还是C#以及Java都支持数组的概念。 数组是具有同一类型的多个对象的集合,是一种数据结构,包含同一类型的多个元素。数组是一组具有相同类型的变量的集合,如一组整数、一组字符等。组成数组的这些变量称为数组的元素。每个数组元素都有一个编号,这个编号叫做下标,C#中的下标是从0开始的,最大的下标等于数组元素个数减一。C#中可

海棠不惜胭脂色,独立蒙蒙细雨中 1554

Flink 作业报错——TaskManager连接不上

Flink 作业报错——TaskManager连接不上

lm223的博客 1901

C# 数组与集合

C# 中的集合类(Collection)是专门用于数据存储和检索的类,类中提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。在 C# 中,Hashtable(哈希表) 类表示根据键的哈希代码进行组织的键(key)/值(value)对的集合,可以使用键来访问集合中的元素。集合类的用途多种多样,例如可以动态的为元素分配内存、根据索引访问列表项等等,这些类创建 Object 类的对象集合,Object 类是 C# 中所有数据类型的基类。

weixin_45788237的博客 1079

2021.02.23丨Virsorter2安装使用及答疑

最近项目比较多,又在学英语,写文章的时间少了很多。最近接到一个病毒组装的项目。用之前组装工具(ABYSS、SPAdes)都没有能够组装较为完整的scafford,今天介绍一款专门用于组装病毒的工具——Virsorter。 Virsorter最早版本发布于2015年,目前已经有了第二个版本。主要用于病毒的组装的注释。详细情况可以查看文章:https://peerj.com/articles/985/ 安装流程 安装文档: https://github.com/jiarong/VirSorter2/b

4836

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C#数组和集合类详解

数组是一种指定长度和数据类型的对象,在实际应用中有一定的局限性。 集合正是为这种局限性而生的,集合的长度能根据需要更改,也允许存放任何数据类型的值。

MrLsss的博客 1844

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【C#】C#中的Array数组,List集合和ArrayList集合

类型安全性:Array和List提供类型安全,而ArrayList不提供。 大小调整:Array大小固定,List和 ArrayList大小可动态调整。 性能:Array通常性能最好,List次之,ArrayList由于装箱和拆箱可能性能最差。 使用场景:Array适合固定大小的集合,List适合动态大小且类型一致的集合,ArrayList适合需要存储不同类型对象的旧代码。

冰茶的博客 2184

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# 数组与集合基础

数组是C#中一种基本的数据结构,用于存储固定大小的相同类型的元素集合。数组在内存中是连续存储的,这使得数组的访问速度非常快。forforeach。

学习和分享 767

C#数组与集合

本文介绍了C#中数组和集合的基本操作与使用方法。首先,数组部分涵盖了定义、初始化、访问、修改、切片、遍历、多维数组、锯齿数组以及常用数组方法。接着,集合部分详细介绍了ArrayList、List<T>、SortedList<TKey, TValue>、LinkedList<T>、Dictionary<TKey, TValue>、Queue<T>和Stack<T>等常用集合类型及其操作。最后,通过一个综合练习项目模板展示了数组与集合的实际

m0_57700068的博客 466

C# 数组、集合与泛型集合的不同

C# 数组、集合与泛型集合的不同 三者区别: 数组(datatype[ ]):存储的类型单一,且不能动态增加。 集合(ArrayList):可以存储多种类型元素,还可以动态增加,但极大消耗资源。 泛型集合(List<T>):存储的类型单一,但可以动态增加。 数组 数组在声明时,必须指定其存储类型,并且直接或间接分配内存空间,因此不能实现动态增加。 数组的声明有4种,以【int】类型举例: int[] aArray = new int[3];//声明一个整型数组,并使用 new 关键字为其分配

Wilhelm的博客 2024

C#基础-区分数组与集合

本篇文章来学习一下C#的数组(Array)与集合(Collection),数组和集合是两种常用的数据结构,均为引用类型,下面通过定义、大小、访问速度等方面比较数组和集合的不同,来进一步加深对它们的理解。

grapefruit_lyy的博客 1960

C# 数组、索引器与集合介绍

若创建自定义的集合类,可利用索引器让用户通过索引获取和设置集合中的元素。例如创建一个自定义的List类,使用索引器实现通过索引值访问列表元素。

zsnandzmn的博客 1196

C# 数组和集合

数组是具有相同数据类型的一组数据的集合。数组中的每一个变量称为数组的元素,数组能够容纳元素的数量称为数组的长度。

钢铁男儿 589

C#基础12-数组集合

本质:C# 数组是的派生对象,用于存储固定长度的同类型元素集合。声明语法数据类型[] 数组名;// 一维数组声明数据类型[,] 数组名;// 二维矩形数组数据类型[][] 数组名;// 交错数组(数组的数组)关键特性固定长度:创建后长度不可变(需动态集合请用List<T>索引访问:元素从0开始索引(如arr[0]类型安全:所有元素必须为同一类型。

李宥的博客 1079

C#--数组和集合

集合和数组

宋文轩 725
上一篇: C#排序比较
下一篇: C#集合--ICollection接口和IList接口
aoding8407
博客等级 码龄11年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值