C#定义动态数组(泛型)

时间:2022-08-30 20:09:50

C#代码中定义动态数组的时候,是很有讲究的。我们通常不知道我们需要多大空间,而且在数据之间的转化也是一个问题。


问题一:


GUID类型无法转换为GUID[]


解答:


我们尝试的时候一般用的是数组:


<span style="font-size:18px;"> 
Guid[] staff = new Guid[] { settingEvaluationBLL.LoadEnities(s => s.YzStaffEntityEvaluaterID.ID == EvaluationID).ToList().Select(u=>u.CriticsID).ToList().FirstOrDefault() };
</span>

我们都知道.FirstOrDefault(),返回序列中的第一个元素;如果序列中不包含任何元素,则返回默认值。因此它根本不是返回的数组。


而实际上new Guid{字符串类型},而且这个字符串类型的是可以转换为GUID类型的。


因此我们用了.ToArray<Guid>();是一个集合,集合的大小是可以变动的。


正确的写法应该是:


<span style="font-size:18px;">           
List<Model.YzSettingEvaluationEntity> resultlist = settingEvaluationBLL.LoadEnities(s=>s.YzStaffEntityEvaluaterID.ID ==EvaluationID).ToList();

Guid[] str = resultlist.Select(u => u.CriticsID).ToArray<Guid>();
</span>

问题二:如何得到任意类型的集合?


<span style="font-size:18px;">            
String[] score;
Decimal[] scorevalue;
score = scoreslist.Select(u => u.ScoreLevel).ToArray();
scorevalue = scoreslist.Select(u => u.Scores).ToArray();</span>

我们看到了,Arraylist默认初始容量为0.随着元素添加到ArrayList中,容量会根据需要通过重新分配自动增加。


当然Arraylist有了如此好处,一定会有弊端的。它的弊端就是类型不安全,我们用它存放至类型的数据,比如int,string型等等,用ArrayList就意味著都需要将值类型装箱为Object对象,使用集合元素时,还需要执行拆箱操作,这就带来了很大的性能损耗。


问题三:如何定义各种类型的泛型?


泛型:


<span style="font-size:18px;">        
IList<String>SeriesNameSave = new List<String>();</span>

如何给泛型装箱:


还举个GUID类型的例子:


<span style="font-size:18px;">
IList<GUID> SeriesIDSave = new List<GUID>();

SeriesIDSave.Add(seriesBLL.LoadEnities(u => u.SeriesName == SeriesValue[i]).Select(u => u.ID).FirstOrDefault());
</span>

泛型在扩容的时候,用到的是Add。


如果我们用泛型集合使用会更加方便,看同样是得到GUID类型:


<span style="font-size:18px;">        
SeriesValue = resultlist.Select(u => u.YzStaffEntityCriticsID.YzSeriesEntityID).ToArray<Guid>();
</span>

这样是不是一句话就可以解决了。


总结:


我们看看数组、集合、泛型之间的区别:


集合可放任意类型的元素,会自动增大,取出时要做类型转换。


泛型集合只能放定义类型的元素,会自动增大,取出时不用做类型转换。


数组只能放定义类型的元素,不会自动增大,取出时不用做类型转换。