解决 Arraylist通常是代替数组吗?

WB1975

众所周知的成员
加入
4月3日,2020年
消息
87
编程经验
Beginner
Arraylist通常是代替数组吗?

我知道ArrayLists更灵活,但有时候你会使用标准数组吗?
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
数组列表. 不再使用。自VB 2005和.NET 2.0,通用 列表<T> 有效更换 数组列表,虽然如果您想要错误,但它仍然可以使用。

这并不是那么重要。您的问题无论如何都适用。这俩 数组列表列表<T> 类是有效提供动态阵列功能的类。重点是,这些类提供了一种类似的数组数据结构,可以根据需要动态生长和缩小。这就是他们存在的原因,如果你不需要这种动态,就没有理由使用它们。无论如何都在内部使用阵列,因此顶部有福彩12选5走势图额外的图层,可以增加开销。如果该层没有任何优势,那么为什么会遭受开销?

简而言之,如果您想要数组是什么 - 福彩12选5走势图固定大小的元素列表 - 然后使用数组。如果您需要动态调整集合提供的大小,则使用集合。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
正如我所说,两者都是 数组列表列表<T> 类是阵列的包装器。默认情况下,内部数组没有元素。添加第福彩12选5走势图项目时,创建具有四个元素的新数组,并分配给第福彩12选5走势图元素的新项目。在添加其他项目时,阵列填充。添加第五项时,创建了福彩12选5走势图具有双倍大小的新数组,现有项目从旧阵列复制,新项被分配给第五个元素,丢弃旧阵列。随着您继续添加项目,内部阵列已满,大小每次都会加倍。这意味着两件事。首先,完成较少的复制,如果你"resized"每次添加项目时,您都有自己的数组。其次,您不必跟踪数组的大小或手动执行任何复制。

这些是这些收集存在的原因:需要调整大小时的效率和便利性。如果您不需要这些内容,使用这些集合类是毫无意义的。福彩12选5走势图数组可以尽一切顺利。他们也可以做一些收藏不能的事情。许多人不知道的东西是访问一系列值类型的元素不会创建副本。要在操作中查看此操作,请尝试此代码:
C#:
var arr = new[] {new Point(10, 20)};
var lst = new List<Point> {new Point(30, 40)};

Console.WriteLine(arr[0].ToString());
Console.WriteLine(lst[0].ToString());

arr[0].X = 50;
arr[0].Y = 60;

Console.WriteLine(arr[0].ToString());

//lst[0].X = 70;
//lst[0].Y = 80;

//Console.WriteLine(lst[0].ToString());

Console.ReadLine();
如果您运行该代码,则会看到“属性” 观点 阵列中的值实际修改。我已经评论了这三条线,因为前两个甚至不会编译,特别是因为它们不能做任何有用的东西,因为他们正在尝试设置将立即丢弃的副本属性。

请注意,您还可以在创建它时为集合指定初始容量,如果您知道您需要至少需要那种商品,您应该会这样做。这样,阵列将是要开始的大小,并且在添加超过多个项目之前,将不需要调整大小。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
My understanding is that the 数组列表 was a way to ease Java programmers into C# when C# was first being introduced (as well as the fact that generics were not yet introduced into the language).

Anyway, another reason not to use 数组列表s is that they suffer from boxing and unboxing overhead if you are storing value types (e.g. simple types like integers, characters, doubles, structs) inside it. Since the 数组列表 internally uses an array of objects, the runtime needs to wrap up a simple type with an object and then put a pointer to that object inside the list. Later when you need read an item from the array list, it need to get the object and then get the simple type out of the object.
 
Last edited:

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
My understanding is that the 数组列表 was a way to ease Java programmers into C# when C# was first being introduced (as well as the fact that generics were not yet introduced into the language).
这可能只是传说。授予谁创建了C#,如果它有类似Java的功能,那就没有惊讶。 ArrayList类是.NET的一部分,而不仅仅是C#。从VB的角度来看,旧的VB6 Collection类可以表现与ArrayList或Hashtable。 VB6有许多组件,具有.NET等价物在逻辑上,逻辑上,概念可以轻松来自VB。姓名至少表明至少有一点Java影响。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
很有可能。我一直尊重Anders for Turbo Pascal,因为这是真正加速我的学习如何编程的语言和平台,但我一直忘记他也在J ++上工作。
 
Last edited:

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
And just to preempt your potential follow up question, 数组列表 is to 列表<T> as HashTable is to Dictionary<TKey, TValue>.
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
And just to preempt your potential follow up question, 数组列表 is to 列表<T> as HashTable is to Dictionary<TKey, TValue>.
确实。您以前已使用System的成员.Collections命名空间或System.Collections.Specialized,例如, StringCollection,现在您应该使用system.collections.generic.命名空间的成员。我总是鼓励人们阅读文档,看看那些命名空间的文档是不是福彩12选5走势图坏主意,以查看可用的内容。我见过许多在线发布的问题,如果已经完成,可能会避免。您不必解决福彩12选5走势图特定的问题来阅读文档。发现可能有用的信息是关于阅读文档的最佳事物之一。
 

WB1975

众所周知的成员
加入
4月3日,2020年
消息
87
编程经验
Beginner
忙于阅读文档

system.collections.generic.


" The system.collections.generic. 命名空间包含定义通用集合的接口和类,允许用户创建强类型的集合,这些集合提供比非通用强类型集合提供更好的类型安全性和性能。"

什么是非通用强类型的集合?

班级
表格1
KeyedByPecollection.<TItem>提供福彩12选5走势图集合,其项目是用作键的类型。
同步Collection.<T>提供福彩12选5走势图线程安全集合,其中包含由通用参数指定的类型为元素的对象。

提供福彩12选5走势图集合,其项目是用作键的类型。 - 我不明白这一点
提供福彩12选5走势图线程安全集合,其中包含由通用参数指定的类型为元素的对象。 - 这个也是

新手是如何理解本文件的?我错过了什么?意思是有福彩12选5走势图关于所有这些或其他东西的教程。

这只是你在你去的技能吗?我真的不想让你在文件中阅读的所有东西骚扰你们。

你明白我的困境吗?

请帮助我了解最佳地点的最佳地点,我觉得经常在海上迷失了。
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,160
地点
挪威
编程经验
10+
什么是非通用强类型的集合?
虽然名单<T>是通用集合,列表<string> or List<int>例如,您从中创建的强烈键入集合 - 但在这里我认为它们意味着通过实现System.Collections.ilist来编写的StringCollection或强烈键入的集合.Collections.ilist。

注意您的链接是版本的".NET平台扩展",如果您选择例如版本"Net Framework 4.8"您可以获得福彩12选5走势图常规仿制类的长长列表。

MS文档包含许多用于主题的文章,而不仅仅是核心类文档,这里是来自C#概念的文章: Generics - C#编程指南
 
Last edited:

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
在开始(.NET Framework 1.1)中,只有这些强烈类型的集合:
和这些非强类型的集合:

At that time, a non-strongly typed collection was anything that took an object a value or a key. As noted above, when you use an object to store things, you could run into the boxing and unboxing overhead. Furthermore, if a collection took just an object, you don't get the benefit of type-safety. Without type safety, you could do something as foolish as:
C#:
var arrayList = new ArrayList();
arrayList.Add(new Human("Luke Skywalker"));
arrayList.Add(new Human("Han Solo"));
arrayList.Add(new Robot("Data"));     // oops!

foreach(Human human in arrayList)
    Console.WriteLine(human);

If ever you programmed in C and you used a generic container library that took void * to hold on to items in the list, it's essentially the same problem of lack of type safety. You have no guarantees that everything inside the list are the same type.
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
什么是非通用强类型的集合?
我已经给了你福彩12选5走势图例子: system.collections.specialized.StringCollection..

数组列表 班级是一系列 目的 参考。没有办法控制在收集中添加了什么类型的对象,并且当您获得对象时,您将其作为福彩12选5走势图 目的 参考并必须将其作为其实际类型。如果你想要福彩12选5走势图集合 细绳 对象然后你必须投射每个项目类型 细绳 当你把它拿出来而你无法阻止那些没有的物体 在没有写自己的警卫代码的情况下添加。

细绳Collection. 班级很像 数组列表 用法但它只接受 细绳 对象,你得到物品 ,所以不需要演员。

列表<T> 班就像 数组列表 在使用中,但您可以在代码中确定项目的类型。一种 列表<string> 会像福彩12选5走势图这样的行为 细绳Collection. 但您也可以为这些项目指定任何其他类型,在那里您必须在泛型出现之前定义自己的自定义类。现在,你可以创建福彩12选5走势图 列表<TextBox> 如果你愿意,以前你要么必须满足于 数组列表 或者定义自己的课程 CollectionBase. 并写下所有 文本框自行编码自己。该代码再次,比使用不太顺利 列表<T> 由于所有内部类型检查。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
就像我说的那样,你可以使用福彩12选5走势图 列表<T> 在大多数情况下,这些天,您必须做零工作以获得任何特定类型的项目的集合。如果你想要自己的强类型的收藏,例如,例如,一种 文本框Collection.,这就是你需要做的事:
C#:
using System.Collections.ObjectModel;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public class TextBoxCollection : Collection<TextBox>
    {
    }
}
你现在可以使用福彩12选5走势图 文本框Collection. 在代码中。该类表现良好,因为没有内部类型检查。泛滥的礼貌,这是福彩12选5走势图已知的事实,每个项目都将是福彩12选5走势图 文本框 因此,不得编写或执行代码以确保。在泛型之前,自定义 文本框Collection. 班级看起来像这样:
C#:
using System;
using System.Collections;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public class TextBoxCollection : CollectionBase
    {
        public TextBox this[int index]
        {
            get => (TextBox) List[index];
            set => List[index] = value;
        }

        public int Add(TextBox value)
        {
            return List.Add(value);
        }

        public int IndexOf(TextBox value)
        {
            return List.IndexOf(value);
        }

        public void Insert(int index, TextBox value)
        {
            List.Insert(index, value);
        }

        public void Remove(TextBox value)
        {
            List.Remove(value);
        }

        public bool Contains(TextBox value)
        {
            // If value is not of type TextBox, this will return false.
            return List.Contains(value);
        }

        protected override void OnInsert(int index, object value)
        {
            // Insert additional code to be run only when inserting values.
        }

        protected override void OnRemove(int index, object value)
        {
            // Insert additional code to be run only when removing values.
        }

        protected override void OnSet(int index, object oldValue, object newValue)
        {
            // Insert additional code to be run only when setting values.
        }

        protected override void OnValidate(object value)
        {
            if (value is TextBox)
                throw new ArgumentException("value must be of type TextBox.", nameof(value));
        }
    }
}
正如您所看到的,那里有铸造和键入。
 
最佳 底部