C#中不常用的数据结构

转载 2012年03月23日 13:39:04

转自:http://blog.csdn.net/ghostbear/article/details/7317786

 

锯齿数组           

  1. ////从1到9打印出一个三角状的图像 
  2.  
  3.             int[][] table = new int[9][]; 
  4.  
  5.             for (int i = 0; i <= table.GetUpperBound(0); i++) 
  6.  
  7.             { 
  8.  
  9.                 table[i] = new int[i + 1]; 
  10.  
  11.                 for (int j = 0; j <= table[i].GetUpperBound(0); j++) 
  12.  
  13.                 { 
  14.  
  15.                     table[i][j] = j + 1; 
  16.  
  17.                 } 
  18.  
  19.   
  20.  
  21.             } 
  22.  
  23.   
  24.  
  25.             for (int i = 0; i <= table.GetUpperBound(0); i++) 
  26.  
  27.             { 
  28.  
  29.                 for (int j = 0; j <=table[i].GetUpperBound(0); j++) 
  30.  
  31.                 { 
  32.  
  33.                     Console.Write(table[i][j].ToString()+" "); 
  34.  
  35.                 } 
  36.  
  37.                 Console.WriteLine(); 
  38.  
  39.             } 

数组片段          

  1. //ArraySegment(数组片段) 
  2.  
  3.            /*
  4.            int[] data=new int[]{1,2,3,4,5,6,7,8,9};
  5.            ArraySegment<int> segment = new ArraySegment<int>(data, 4, 5);
  6.            for (int i = 0; i < segment.Count; i++)
  7.            {
  8.                Console.Write(segment.Array[segment.Offset + i].ToString()
  9. + " ");
  10.            }
  11.            Console.WriteLine();
  12.            */ 

IStructuralEquatable和IstructuralComparable

  1. //比较数组的等值性 ,被比较的元素需要实现接口IEuqatable 
  2.  
  3. Person[] family1 = new Person[] 
  4.  
  5.             { 
  6.  
  7.                 new Person("jim","green",21) 
  8.  
  9.                 ,new Person("lucy","li",22) 
  10.  
  11.                 ,new Person ("jack","wang",23) 
  12.  
  13.             }; 
  14.  
  15.   
  16.  
  17.             Person[] family2 = new Person[] 
  18.  
  19.             { 
  20.  
  21.                 new Person("jim","green",21) 
  22.  
  23.                 ,new Person("lucy","li",22) 
  24.  
  25.                 ,new Person ("jack","wang",23) 
  26.  
  27.             }; 
  28.  
  29.   
  30.  
  31.             if (family1 == family2) 
  32.  
  33.             { 
  34.  
  35.                 Console.WriteLine("it's equal"); 
  36.  
  37.             } 
  38.  
  39.             else 
  40.  
  41.             { 
  42.  
  43.                 Console.Write("it's not equal"); 
  44.  
  45.             } 
  46.  
  47.   
  48.  
  49.             if ((family1 as IStructuralEquatable).Equals(family2, EqualityComparer<Person>.Default)) 
  50.  
  51.             { 
  52.  
  53.                 Console.WriteLine("it's equal"); 
  54.  
  55.             } 
  56.  
  57.             else 
  58.  
  59.             { 
  60.  
  61.                 Console.Write("it's not equal"); 
  62.  
  63.             } 
  64.   

IFormatProvider

  1. //对象必须实现接口Iformattable 
  2.  
  3. class Person:IFormattable,IComparable<Person> 
  4.  
  5.     { 
  6.  
  7.         public string FirstName { get; set; } 
  8.  
  9.         public string LastName { get; set; } 
  10.  
  11.         public int Age { get; set; } 
  12.  
  13.         public string ToString(string format, IFormatProvider formatProvider) 
  14.  
  15.         { 
  16.  
  17.             string result = string.Empty; 
  18.  
  19.             switch (format) 
  20.  
  21.             {  
  22.  
  23.                 case "F"
  24.  
  25.                     result = FirstName; 
  26.  
  27.                     break
  28.  
  29.                 case "L"
  30.  
  31.                     result = LastName; 
  32.  
  33.                     break
  34.  
  35.                 case "FULL"
  36.  
  37.                     result = FirstName + LastName; 
  38.  
  39.                     break
  40.  
  41.                 default
  42.  
  43.                     break
  44.  
  45.   
  46.  
  47.             } 
  48.  
  49.             return result; 
  50.  
  51.         } 
  52.  
  53.   
  54.  
  55.         public int CompareTo(Person other) 
  56.  
  57.         { 
  58.  
  59.             return this.FirstName.CompareTo(other.FirstName); 
  60.  
  61.         } 
  62.  
  63.     } 


调用代码:

  1. Person jim = new Person() { FirstName = "Jim", LastName = "Green", Age = 11 }; 
  2.  
  3. Console.WriteLine(jim.ToString("F", null)); 

SortedList(有序列表)

  1. SortedList<string, string> charaterList = new SortedList<string, string>(); 
  2.  
  3. charaterList.Add("A", "this is charater A"); 
  4.  
  5. charaterList.Add("E", "this is charater E"); 
  6.  
  7. charaterList.Add("D", "this is charater D"); 
  8.  
  9. charaterList.Add("C", "this is charater C"); 
  10.  
  11. charaterList.Add("B", "this is charater B"); 
  12.  
  13.  
  14.  
  15. foreach(string tmp in charaterList.Keys) 
  16.  
  17.  
  18.     Console.WriteLine(charaterList[tmp]); 
  19.  

执行结果:

 

this is charater A

this is charater B

this is charater C

this is charater D

this is charater E

字典

  1. Dictionary<string, string> programBook = new Dictionary<string, string>(); 
  2.  
  3. programBook.Add("chapter1", "base programming skill"); 
  4.  
  5. programBook.Add("chapter2", "the amateurism programming skill"); 
  6.  
  7. programBook.Add("chapter3", "the professional programming skill"); 
  8.  
  9. programBook.Add("chapter4", "the god programming skill"); 
  10.  
  11.  
  12.  
  13. Random rand = new Random(); 
  14.  
  15. string[] content = programBook.Keys.ToArray<string>(); 
  16.  
  17.  
  18.  
  19. Console.WriteLine(programBook[content[rand.Next(0, 4)]]); 


Lookup(一键多值)

  1. Person[] persons = new Person[]{ 
  2.  
  3.                new Person{FirstName="Li",LastName="Ming",Age=21}, 
  4.  
  5.                new Person{FirstName="Li",LastName="XinLiang",Age=22}, 
  6.  
  7.                new Person{FirstName="Wang",LastName="Kai",Age=23}, 
  8.  
  9.                new Person{FirstName="Li",LastName="SiMing",Age=24} 
  10.  
  11.    }; 
  12.  
  13.  
  14.  
  15.    var personsContent = persons.ToLookup(person => person.FirstName); 
  16.  
  17.    ILookup<string,Person> ok = persons.ToLookup<Person, string>(a => a.FirstName); 
  18.  
  19.  
  20.  
  21.    foreach (Person tmp in personsContent["Li"]) 
  22.  
  23.    { 
  24.  
  25.        Console.WriteLine(tmp.FirstName+tmp.LastName); 
  26.  
  27.    } 
  28.  
  29.  
  30.  
  31.    foreach (Person tmp in ok["Li"]) 
  32.  
  33.    { 
  34.  
  35.        Console.WriteLine(tmp.FirstName + tmp.LastName); 
  36.  
  37.    } 


结果:

 

LiMing

LiXinLiang

LiSiMing

LiMing

LiXinLiang

LiSiMing

SortedDictionary(有序字典)

  1. SortedDictionary<string, string> book = new SortedDictionary<string, string>(); 
  2.  
  3.     book.Add("chapter1", "this is chapter 1"); 
  4.  
  5.     book.Add("chapter6", "this is chapter 6"); 
  6.  
  7.     book.Add("chapter3", "this is chapter 3"); 
  8.  
  9.     book.Add("chapter2", "this is chapter 2"); 
  10.  
  11.     book.Add("chapter9", "this is chapter 9"); 
  12.  
  13.     book.Add("chapter4", "this is chapter 4"); 
  14.  
  15.     book.Add("chapter7", "this is chapter 7"); 
  16.  
  17.     book.Add("chapter5", "this is chapter 5"); 
  18.  
  19.     book.Add("chapter8", "this is chapter 8"); 
  20.  
  21.             
  22.  
  23.   
  24.  
  25.     foreach(string key in book.Keys) 
  26.  
  27.     { 
  28.  
  29.         Console.WriteLine(key + ":" + book[key]); 
  30.  
  31.     } 
  32.  
  33.   
  34.  
  35. Console.WriteLine(); 
  36.  
  37.   
  38.  
  39.   
  40.  
  41.     SortedDictionary<Person, string> contactBook = new SortedDictionary<Person, string>(); 
  42.  
  43.     contactBook.Add(new Person { FirstName = "Li", LastName = "XiaoYao", Age = 20 }, "135****3797"); 
  44.  
  45.     contactBook.Add(new Person { FirstName = "Zhao", LastName = "LinEr", Age = 20 }, "132****8534"); 
  46.  
  47.     contactBook.Add(new Person { FirstName = "Lin", LastName = "YueRu", Age = 20 }, "131****6734"); 
  48.  
  49.     contactBook.Add(new Person { FirstName = "Jiu", LastName = "Xian", Age = 20 }, "137****3215"); 
  50.  
  51.     contactBook.Add(new Person { FirstName = "Xiao", LastName = "QiGai", Age = 20 }, "134****4751"); 
  52.  
  53.     contactBook.Add(new Person { FirstName = "Jian", LastName = "Xian", Age = 20 }, "133****1642"); 
  54.  
  55.   
  56.  
  57.      
  58.  
  59.     foreach (Person key in contactBook.Keys) 
  60.  
  61.     { 
  62.  
  63.         Console.WriteLine(key.FirstName+key.LastName + ":" + contactBook[key]); 
  64.  
  65.     } 


执行结果:

 

chapter1:this is chapter 1

chapter2:this is chapter 2

chapter3:this is chapter 3

chapter4:this is chapter 4

chapter5:this is chapter 5

chapter6:this is chapter 6

chapter7:this is chapter 7

chapter8:this is chapter 8

chapter9:this is chapter 9

JianXian:133****1642

JiuXian:137****3215

LiXiaoYao:135****3797

LinYueRu:131****6734

XiaoQiGai:134****4751

ZhaoLinEr:132****8534

Iset接口(HashSet,SortedSet)

    Iset接口提供如下方法:创建合集,创建交集,或于一个集合做比较判断是否为其的子集或超集。

  1. //无序集合HashSet 
  2. HashSet<string> charaterList = new HashSet<string>(); 
  3. charaterList.Add("A"); 
  4. charaterList.Add("B"); 
  5. charaterList.Add("C"); 
  6. if (!charaterList.Add("A")) 
  7.     Console.WriteLine("Current Collection already have the 'A'"); 
  8. foreach (string tmp in charaterList) 
  9.     Console.WriteLine(tmp); 
  10. Console.WriteLine(); 
  11.         
  12.  
  13.  
  14. //有序集合SortedSet 
  15. SortedSet<string> charaterList2 = new SortedSet<string>(); 
  16. charaterList2.Add("A"); 
  17. charaterList2.Add("B"); 
  18. charaterList2.Add("D"); 
  19. charaterList2.Add("C"); 
  20. charaterList2.Add("G"); 
  21. charaterList2.Add("E"); 
  22. charaterList2.Add("F"); 
  23. if (!charaterList.Add("A")) 
  24.     Console.WriteLine("Current Collection already have the 'A'"); 
  25.  
  26. foreach (string tmp in charaterList2) 
  27.     Console.WriteLine(tmp); 
  28. //IsSubSetOf()和IsSuperSetOf()方法 
  29. // int[] onetoten = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
  30. //int[] fivetoeight = new int[] { 5, 6, 7, 8 }; 
  31.          
  32.  
  33. HashSet<int> onetoten = new HashSet<int>(); 
  34. onetoten.Add(1); 
  35. onetoten.Add(2); 
  36. onetoten.Add(3); 
  37. onetoten.Add(4); 
  38. onetoten.Add(5); 
  39. onetoten.Add(6); 
  40. onetoten.Add(7); 
  41. onetoten.Add(8); 
  42. onetoten.Add(9); 
  43. onetoten.Add(10); 
  44.  
  45. HashSet<int> fivetoeight = new HashSet<int>(); 
  46. fivetoeight.Add(5); 
  47. fivetoeight.Add(6); 
  48. fivetoeight.Add(7); 
  49. fivetoeight.Add(8); 
  50.  
  51. HashSet<int> eleventofifteen = new HashSet<int>(); 
  52. eleventofifteen.Add(11); 
  53. eleventofifteen.Add(12); 
  54. eleventofifteen.Add(13); 
  55. eleventofifteen.Add(14); 
  56. eleventofifteen.Add(15); 
  57. eleventofifteen.Add(1); 
  58.  
  59.         
  60.  
  61. if (fivetoeight.IsSubsetOf(onetoten)) 
  62.     Console.WriteLine("fivetoeight is subset of onetoten."); 
  63.  
  64. if (fivetoeight.IsSupersetOf(fivetoeight)) 
  65.     Console.WriteLine("ontoten is superset of fivetoten"); 
  66.  
  67. //onetoten.UnionWith(eleventofifteen);//这里包含重复的元素 
  68. onetoten.ExceptWith(fivetoeight); 
  69. foreach (int tmp in onetoten) 
  70.     Console.WriteLine(tmp); 


执行结果:

 

Current Collection already have the 'A'

A

B

C

Current Collection already have the 'A'

A

B

C

D

E

F

G

fivetoeight is subset of onetoten.

ontoten is superset of fivetoten

1

2

3

4

9

10

可观察的集合

  1. ObservableCollection<string> paperFirm = new ObservableCollection<string>(); 
  2.  
  3.     string[] personList=new string[]{"Bank","Bruce"}; 
  4.  
  5.   
  6.  
  7.     paperFirm.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(paperFirm_CollectionChanged); 
  8.  
  9.   
  10.  
  11.     paperFirm.Add("Jim"); 
  12.  
  13.     paperFirm.Add("Lucy"); 
  14.  
  15.     paperFirm.Add("Alex"); 
  16.  
  17.     paperFirm.Add("Jeff"); 
  18.  
  19.   
  20.  
  21.     paperFirm.Remove("Jim");//删除jim 
  22.  
  23.     paperFirm.Remove("Lucy");//删除lucy 
  24.  
  25.   
  26.  
  27. 元素改变后调用的方法体 
  28.  
  29. static void paperFirm_CollectionChanged(object sender,  
  30.  
  31. System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
  32.  
  33.         { 
  34.  
  35.             if (e.Action == NotifyCollectionChangedAction.Add) 
  36.  
  37.             {  
  38.  
  39.                 Console.WriteLine(string.Format("you add a element in {0},it is value is {1}",new object[]{e.NewStartingIndex,((ObservableCollection<string>)sender)[e.NewStartingIndex]})); 
  40.  
  41.             } 
  42.  
  43.             if (e.Action == NotifyCollectionChangedAction.Remove) 
  44.  
  45.             { 
  46.  
  47.                 Console.WriteLine(string.Format("you remove a element in {0},it is value is {1}", new object[] { e.OldStartingIndex,e.OldItems[0]})); 
  48.  
  49.             } 
  50.  
  51.             if (e.Action == NotifyCollectionChangedAction.Replace) 
  52.  
  53.             {  
  54.  
  55.              
  56.  
  57.             } 
  58.  
  59.             if (e.Action == NotifyCollectionChangedAction.Reset) 
  60.  
  61.             { 
  62.  
  63.                 Console.WriteLine("reset event!"); 
  64.  
  65.             } 
  66.  
  67.         } 

执行结果:

 

you add a element in 0,it is value is Jim

you add a element in 1,it is value is Lucy

you add a element in 2,it is value is Alex

you add a element in 3,it is value is Jeff

you remove a element in 0,it is value is Jim

you remove a element in 0,it is value is Lucy

小结:

    在日常的开发中,我们主要使用的数据结构并不是很多。它们主要为:值列表,数组,栈,队列或字典。在.Net4版本中又扩展了些数据结构它们分别为:有序队列,存在一对多关系的字典,可观察的集合。也添加了些接口来处理集合对象的值比较问题及集合与集合之间运算的问题。

    到目前为止.Net用来处理数据问题的接口如下图:

 

c#常用数据结构解析

前言: 可能去过小匹夫博客的盆油们读过这篇对于数据结构的总结,但是小匹夫当时写那篇文章的时候略有匆忙,所以今天进行了一些增改,重新发表在蛮牛。作为程序猿,对于常见的数据结构的掌握是非常必要的,也许这...
  • suifcd
  • suifcd
  • 2015年01月19日 09:27
  • 12953

面试被虐系列_基础数据结构篇_C#集合接口_1

在任何一门号称为高级编程语言的语言当中,各种基础集合类是必不可少的一部分。在实际的编程当中,开发人员肯定会遇到各种需要操作大量数据,或者大量对象的情况。在面对不同的应用场景下,各种不同的集合类便在这里...
  • u012143360
  • u012143360
  • 2017年03月28日 11:52
  • 320

c++中STL常用的数据结构

一.stack(栈) 常见的操作: #include using namespace std; int main() { stack S; S.push(3); S.p...
  • bbtl_ast
  • bbtl_ast
  • 2017年06月02日 16:00
  • 334

java jdk中使用到的数据结构

在java中可能很多人都会忽略数据结构(类似树,跳跃表等),大家都比较熟悉链表,数组,栈,队列,哈希表等。最近看了jdk中关于树和跳跃表等的实现,其实数据结构真的是基础,有兴趣的java程序员可以翻开...
  • zhongweijian
  • zhongweijian
  • 2012年11月02日 14:10
  • 4643

Java常用数据结构总结

Java中有几种常用的数据结构,主要分为Collection和Map两个主要接口,而程序中最终使用的数据结构是继承自这些接口的数据结构类。其主要关系: 1、几个常用类的区别: 1.Arra...
  • wufaliang003
  • wufaliang003
  • 2017年02月16日 17:04
  • 1274

java中常用的几种数据结构

数据结构: 一.链表      1.链表与数组的区别         数组在使用之前必须定义大小,而且不能动态定义大小,会造成给数组分配了太多的单元而浪费了宝贵的资源,糟糕的一面是,程序运行时需要处理...
  • caiwanxia1
  • caiwanxia1
  • 2016年11月01日 10:46
  • 931

C# 常用数据结构简单总结(与C++对比)

C# 常用数据结构简单总结(与C++对比)首先说明, C# 中的引用即为C++中的指针。 值类型:内置数据类型,自定义的struct,不包括string。它们分配在栈上,超出作用域自动销毁。 引用...
  • a1eafall
  • a1eafall
  • 2017年06月17日 11:35
  • 405

数据结构和常用算法

1. 常见数据结构 人们进行程序设计时通常关注两个重要问题,一是如何将待处理的数据存储到计算机内存中,即数据表示;二是设计算法操作这些数据,即数据处理。数据表示的本质是数据结构设计,数据处理的本质是...
  • miracle_gu
  • miracle_gu
  • 2015年10月02日 14:04
  • 4562

C#中不常用的数据结构

C#中不常用的数据结构锯齿数组            ////从1到9打印出一个三角状的图像 int[][] table = new int[9][]; ...
  • ghostbear
  • ghostbear
  • 2012年03月04日 14:17
  • 2876

几种常见的重要数据结构总结

栈的表示1. 数组2. 链表(优点:无需指定大小,不存在栈溢出等情况的处理) 队列表示1. 数组(构造成循环队列以提高空间使用效率)2. 链表  二叉树 (满二叉树、完全二叉树、稀疏二叉树等)1. 数...
  • Andrew659
  • Andrew659
  • 2010年07月30日 22:10
  • 8015
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中不常用的数据结构
举报原因:
原因补充:

(最多只允许输入30个字)