国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

C# 2.0新特性探究之模擬泛型和內置算法

2024-07-21 02:26:28
字體:
來源:轉載
供稿:網友


  在c#2.0中,匿名方法、ienumerable接口和匿名方法的合作,使很多的編程任務變得非常的簡單,而且寫出來的程序非常的優(yōu)美。

   比如,我們可以寫出如下的代碼:

list<book> thelib = library.getbooks();

list<book> found = thelib.findall(delegate(book curbook)
{
  if (curbook.isbn.startswith("..."))
   return true;
   return false;
});

foreach (book b in found)
console.writeline(b.isbn);

   這段程序非常簡單的展示給我們需要查找的信息,代碼也非常的直接易懂。內置的數據結構給了我們強大的算法支持,不過,能不能夠為自定義的類定義類似的算法呢?

   比如,如果我有一個自定義的library類并沒有使用list<book>存儲數據,而是使用某種自定義的數據結構,我能不能也讓用戶使用類似的語法,忽略存儲細節(jié)的使用匿名委托來實現(xiàn)特定的算法呢?

   答案當然是肯定的,而且在c#中實現(xiàn)這樣的功能是非常的簡單。

   首先讓我們看看findall中用到的匿名委托的原型

public delegate bool predicate<t>(t obj);

   很明顯的,上面的代碼等于注冊了一個搜索的回調,而在list內部定義了某種遍歷的機制,從而實現(xiàn)了一個漂亮的算法結構closure。

   看到了這些,我們就可以定義自己的算法結構了,首先,我定義了一個如下的類

public class myvec<t>
{
  public static myvec<t> operator +(myvec<t> a, t b)
  {
   a._list.add(b);
   return a;
  }
  public override string tostring()
  {
   stringbuilder builder = new stringbuilder();
   foreach (t a in _list)
   {
    builder.append(a.tostring());
    builder.append(",");
   }
   string ret = builder.remove(builder.length - 1, 1).tostring();
   return ret;
  }

  public myvec<t<>findall(predicate<t> act)
  {
   myvec<t:>t2 = new myvec<t>();
   foreach(t i in _list)
   {
    if (act(i))
    t2._list.add(i);
   }
   return t2;
  }

  // this is the inner object
  private list<t> _list = new list<t>();
}

   這個類中包含了一個的list<t>結構,主要是為了證實我們的想法是否可行,事實上,任何一個可以支持foreach遍歷的結構都可以作為內置的數據存儲對象,我們會在后面的例子中給出一個更加復雜的實現(xiàn)。

   下面是用于測試這個實驗類的代碼:

static void main(string[] args)
{
  myvec<int> a = new myvec<int>();
  a += 12;
  a += 15;
  a += 32;
  myvec<int> b = a.findall(delegate(int x)
  {
   if (x < 20) return true; return false;
  }
);

  console.writeline("vection original");
  console.writeline(a.tostring());
  console.writeline("vection found");
  console.writeline(b.tostring());
  console.readline();
}


   編譯,執(zhí)行,程序輸出:

vection original

12,15,32

vection found

32

   和我們預期的完全相同。很明顯的,list內部的算法與我們預期的基本相同。

   predicate<t>僅僅是為了仿照系統(tǒng)的實現(xiàn)而采用的一個委托,事實上可以使用自己定義的任何委托作為回調的函數體。

   通過使用ienumberable接口,可以實現(xiàn)對任意結構的遍歷,從而對任何數據結構定義強大的算法支持。

 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 南充市| 涞源县| 济南市| 淮阳县| 梅河口市| 罗平县| 五指山市| 民和| 崇文区| 津市市| 温泉县| 花莲县| 双峰县| 定结县| 铁岭市| 遂溪县| 绥棱县| 杭锦后旗| 德兴市| 平度市| 三穗县| 巴林右旗| 绥化市| 镇原县| 静乐县| 资兴市| 米林县| 陵川县| 花莲市| 含山县| 信宜市| 六安市| 运城市| 伊宁市| 安西县| 远安县| 兴安盟| 丹棱县| 柯坪县| 峨边| 广平县|