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>
这样是不是一句话就可以解决了。
总结:
我们看看数组、集合、泛型之间的区别:
集合可放任意类型的元素,会自动增大,取出时要做类型转换。
泛型集合只能放定义类型的元素,会自动增大,取出时不用做类型转换。
数组只能放定义类型的元素,不会自动增大,取出时不用做类型转换。