十六 数组

System.Object 到 System.Array 然后所有数组都是从他派生

首先是创建数组

int[] a = new int[100];
T[] a = new T[];
T[] b = new T[] { T a,T b };

二维数组
T[,] a = new T[10,10];
锯齿数组
T[][] a = new T[3][];






数组都是引用类型

所以他得机制也和普通的引用类型一样

引用类型

关于数组转型

理论上这种情况不应该被允许。
需要转型个人感觉就意味着 设计不合理= = 重构一下吧。


数组复制

1.Array.Clone

1 int[] intArray1 = { 1, 2 };
2 var o = (int[]) intArray1.Clone();


2.直接循环复制

1 int[] a = { 1,2,3,4 };
2 int[] b = new int[a.Length];
3 for (int i = 0; i != b.Length; i++)
4 {
5 b[i] = a[i];
6 }


3.Array.Copy

名称说明
公共方法静态成员Copy(Array, Array, Int32) 从第一个元素开始复制 Array 中的一系列元素,将它们粘贴到另一 Array 中(从第一个元素开始)。 长度指定为 32 位整数。
公共方法静态成员Copy(Array, Array, Int64) 从第一个元素开始复制 Array 中的一系列元素,将它们粘贴到另一 Array 中(从第一个元素开始)。 长度指定为 64 位整数。
公共方法静态成员Copy(Array, Int32, Array, Int32, Int32) 从指定的源索引开始,复制 Array 中的一系列元素,将它们粘贴到另一 Array 中(从指定的目标索引开始)。 长度和索引指定为 32 位整数。
公共方法静态成员Copy(Array, Int64, Array, Int64, Int64) 从指定的源索引开始,复制 Array 中的一系列元素,将它们粘贴到另一 Array 中(从指定的目标索引开始)。 长度和索引指定为 64 位整数。

4.CopyTo

1 int[] a = { 1,2,3,4 };
2 int[] b = new int[a.Length];
3 a.CopyTo(b, a.Length);


5.这个是网上找的

    string[] student1 = {  
"$", "$", "c", "m", "d", "1",
"2", "3", "1", "2", "3" };
string[] student2 = { "0", "1",
"2", "3", "4", "5", "6", "6", "1",
"8", "16","10","45", "37", "82" };
ArrayList student = new ArrayList();
foreach (string s1 in student1)
{
student.Add(s1);
}
foreach (string s2 in student2)
{
student.Add(s2);
}
string[] copyAfter =
(string[])student.ToArray(typeof(string));


关于深浅拷贝 本人原以为我理解清楚了

深拷贝: 完全copy

浅拷贝: 只是复制引用,而在内存堆中的地址相同

这里却让我摸不着头脑

1 string[] intArray1 = { "a", "b" };
2 var o = (string[]) intArray1.Clone();
3 o[0] = "b";

这里 intArray 却不发生任何变化..

PS: 这里会补上,待本人去查查...

http://social.msdn.microsoft.com/Forums/zh-CN/csharplanguage/thread/63fc767f-d4ac-4e55-be2f-9a175eaedc93




关于手动创建数组

var o = Array.CreateInstance(typeof(a), 10);
for (var i = 0; i < o.Length; i++)
{
  o.SetValue(new a(), i); //这里装箱拆箱了吧= =
}
for (int i = 0; i < 5; i++)
{
  Console.WriteLine(o.GetValue(i));
}



ok
o 是object[]
如果只是创建 数组 确实没有必要用这玩意儿

这玩意儿得好处是可以创建索引非0的数组
int[] lengths = {2, 3};
int[] lowerBounds = {1, 10};
Array racers = Array.CreateInstance(typeof(int), lengths, lowerBounds);
不禁想问 非0数组这玩意儿有嘛用. PS. 本人从未使用过
某人猜测。 估计只有对代码要跨语言的时候才会用到 比如某些语言的是非0数组.. 如果只是在C# 中使用 那么再说



关于Array的其他静态方法

1 int[] a = { 1,2,3,4 };
2 Array.Find<Int32>(a, p => {
3 if (p == 1) return true;
4 else return false;
5 });

本人使用最多的就是这种形式= =

其他类似

Array.Sort

Array.Select

都可以以此类推..

主要 重载版本太多如果全部。。 太那个啥。 算是一个书签 用到的时候在来翻吧






转载于:https://www.cnblogs.com/CallMeTommy/archive/2011/09/26/2185648.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值