婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 關于.NET Framework中的設計模式--應用策略模式為List排序

關于.NET Framework中的設計模式--應用策略模式為List排序

熱門標簽:濟源人工智能電話機器人價格 山東防封電銷卡辦理套餐 廈門四川外呼系統 百度地圖標注點擊事件 泰州手機外呼系統軟件 內蒙古智能電銷機器人哪家強 杭州智能電話機器人 地圖標注位置多的錢 怎樣在地圖標注消火栓圖形
簡單類型排序

編程時遇到排序在平常不過,使用.Net最常見的就是對泛型ListT>進行排序,如果T是簡單數據類型排序那么很簡單

復制代碼 代碼如下:

public Listint> SortSimpleList(Listint> list)
{
list.Sort();
return list;
}

同樣對string等簡單類型ListT>排序均如此,如果我們要排的對象復雜了怎么辦,我們知道ListT> sort()最后是用快速排序實現,快速排序也好,什么排序都需要知道list中item之間的比較結果,如果是簡單的int類型,直接判斷即可,對實現了IComparable接口的對象,可以調用其CompareTo()實現item比較大小,下面是一個快速排序的寫法

復制代碼 代碼如下:

void SortT>(T[] array, int left, int right, IComparer_slyT> comparer) where T : IComparable
{
if (left right)
{
T middle = array[(left + right) / 2];
int i = left - 1;
int j = right + 1;
while (true)
{
while (array[++i].CompareTo(middle) 0) ;

while (array[--j].CompareTo(middle) > 0) ;

if (i >= j)
break;

T temp = array[i];
array[i] = array[j];
array[j] = temp;
}

Sort(array, left, i - 1, comparer);
Sort(array, j + 1, right, comparer);
}
}

問題

對于前兩種情況固然可以實現排序,但是我們不可能要求所有待排序的對象都實現IComparable接口,就算能夠保證每個對象都實現IComparable接口,如果想實現對象內多個字段排序,比如Student對象,有時候想按照姓名排序,有時候是成績,有時候是年齡,這怎么破

按照面向對象的思想,要把變化獨立出來,封裝變化,對于我們排序ListT>時變化的其實就是怎么比較兩個對象的大小的算法,如果我們可以把這個算法拿出來,排序就簡單了很多,無論什么排序,算法都是由的,我們要封裝的部分是怎樣比較兩個item的大小的算法,為了實現拓展性我們要遵循面向對象設計的另外一個重要原則,針對接口編程,而不是針對實現編程。

編寫通用的ListT>排序方法

首先定義一個接口,里面有一個比較item大小的方法,在排序的時候作為參數傳入,當然是傳入它的實現類,有了這個想法,我們可以自己寫個ListT>的排序方法

復制代碼 代碼如下:

public interface mparer_slyT>{
int Compare(T x, T y);
}

然后為了測試,我們為ListT>加一個包裝,寫一個自己的Sort方法,內部也用快速排序實現。一直困惑我們的變化部分——比較大小算法,我們把它封轉起來,作為參數傳入

復制代碼 代碼如下:

using System;
using System.Collections.Generic;

namespace Test.Stategy
{public class ListTestT>
{
public ListT> list = new ListT>();
public void Sort(IComparer_slyT> comparer)
{
T[] array = list.ToArray();
int left = 0;
int right = array.Length - 1;
QuickSort(array, left, right, comparer);
list = new ListT>(array);
}

private void QuickSortS>(S[] array, int left, int right, IComparer_slyS> comparer)
{
if (left right)
{
S middle = array[(left + right) / 2];
int i = left - 1;
int j = right + 1;
while (true)
{
while (comparer.Compare(array[++i], middle) 0) ;

while (comparer.Compare(array[--j], middle) > 0) ;

if (i >= j)
break;

S temp = array[i];
array[i] = array[j];
array[j] = temp;
}

QuickSort(array, left, i - 1, comparer);
QuickSort(array, j + 1, right, comparer);
}
}
}
}

比如現在我們有個Student 的實體

復制代碼 代碼如下:

public class Student
{
public Student(int id, string name)
{
this.ID = id;
this.Name = name;
}
public int ID { get; set; }
public string Name { get; set; }
}

如果想對這個實體組成的ListT>進行排序,我們只需一個實現 IComparer_slyStudent>的類 StudentComparer,并在內部實現其比較大小方法——Compare(),同時我們可以添加遞增還是遞減排序的控制

復制代碼 代碼如下:

class StudentComparer : IComparer_slyStudent>
{
private string expression;
private bool isAscending;
public StudentComparer(string expression, bool isAscending)
{
this.expression = expression;
this.isAscending = isAscending;
}

public int Compare(Student x, Student y)
{
object v1 = GetValue(x), v2 = GetValue(y);
if (v1 is string || v2 is string)
{
string s1 = ((v1 == null) ? "" : v1.ToString().Trim());
string s2 = ((v2 == null) ? "" : v2.ToString().Trim());
if (s1.Length == 0 s2.Length == 0)
return 0;
else if (s2.Length == 0)
return -1;
else if (s1.Length == 0)
return 1;
}

// 這里就偷懶調用系統方法,不自己實現了,其實就是比較兩個任意相投類型數據大小,自己實現比較麻煩
if (!isAscending)
return Comparer.Default.Compare(v2, v1);
return Comparer.Default.Compare(v1, v2);
}

private object GetValue(Student stu)
{
object v = null;
switch (expression)
{
case "id":
v = stu.ID;
break;
case "name":
v = stu.Name;
break;
default:
v = null;
break;
}
return v;
}
}

測試一下好不好使

復制代碼 代碼如下:

static void Main(string[] args)
{
ListTestStudent> test = new ListTestStudent>();
for (int i = 0; i 10; i++)
{
Student stu = new Student(i,string.Format("N_"+(9-i)));
test.list.Add(stu);
}
Console.WriteLine("元數據");
for (int i = 0; i test.list.Count;i++ )
{
Console.WriteLine(string.Format("ID:{0} , Name:{1}", test.list[i].ID, test.list[i].Name));
}

Console.WriteLine("Name 遞增");
test.Sort(new StudentComparer("name", true));
for (int i = 0; i test.list.Count; i++)
{
Console.WriteLine(string.Format("ID:{0} , Name:{1}", test.list[i].ID, test.list[i].Name));
}
}

看看效果

.NET List的sort如何為我們排序

用ILSpy反編譯可以看到在調用ListT>的sort()方法時內部調用的時 this.Sort(0, this.Count, null); 然后往里面扒,經過一系列異常處理后會調用 Array.SortT>(this._items, index, count, comparer); this._items是把List內容轉換成數組,同樣再經歷一些列異常處理,調用方法 ArraySortHelperT>.Default.Sort(array, index, length, comparer); 再往里就和我們上面寫的方法大同小異了,只不過微軟加了很多異常處理和算法優化。

策略模式

看清楚了上面這個例子我們就可以進入正題,說說我們的策略模式了。策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)

這個模式涉及到三個角色:

環境(Context)角色:持有一個Strategy類的引用。抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。具體策略(ConcreteStrategy)角色:包裝了相關的算法或行為。

相信大家可以分方便的把我們上面例子中的類對應上策略模式的角色,IComparer接口是我們的抽象策略角色, ListTestT> 類持有抽象策略的引用是環境(在Sort方法中,其實可以把接口定義為類的屬性,在構造函數中賦值,不過不適合此場景,畢竟并不是所有List都需要排序,不能強制其接受一個可能會用不到的接口,當然對每個實例都需要用某個策略的場景是合適的),毫無疑問我們實現IComparer抽象策略的類就是具體策略。

使用場景

策略模式很容易理解,不過能夠用它很好的理解封裝變化和針對接口編程者兩個面向對象設計原則,我們來看看什么時候我們會用策略模式

1、 多個類只區別在表現行為不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行為。

2、 需要在不同情況下使用不同的策略(算法),這些策略有統一接口。

3、 對客戶隱藏具體策略(算法)的實現細節,彼此完全獨立。

策略模式的優勢和不足

優點:

1、 提供了一種替代繼承的方法,而且既保持了繼承的優點(代碼重用)還比繼承更靈活(算法獨立,可以任意擴展)。

2、 使用組合,避免程序中使用多重條件轉移語句,使系統更靈活,并易于擴展。

3、 遵守大部分GRASP原則和常用設計原則,高內聚、低偶合。

缺點:

1、 因為每個具體策略類都會產生一個新類,所以會增加系統需要維護的類的數量。

您可能感興趣的文章:
  • Asp.Net設計模式之單例模式詳解
  • C#設計模式之Template模板方法模式實現ASP.NET自定義控件 密碼強度檢測功能
  • ASP.NET的適配器設計模式(Adapter)應用詳解
  • jQuery 驗證插件 Web前端設計模式(asp.net)
  • .net設計模式之裝飾模式(Decorator)

標簽:百色 周口 朝陽 喀什 新鄉 臺州 洛陽 朔州

巨人網絡通訊聲明:本文標題《關于.NET Framework中的設計模式--應用策略模式為List排序》,本文關鍵詞  關于,.NET,Framework,中的,設計模式,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《關于.NET Framework中的設計模式--應用策略模式為List排序》相關的同類信息!
  • 本頁收集關于關于.NET Framework中的設計模式--應用策略模式為List排序的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    在线一区二区三区四区| 国产精品久久久久毛片软件| 自拍偷拍国产精品| 91福利区一区二区三区| 国产jizzjizz一区二区| 中文字幕第一页久久| 一本一道综合狠狠老| 日本女人一区二区三区| 久久久久久久久97黄色工厂| 国产成a人亚洲精| 国产精品一区二区久激情瑜伽| 国产午夜亚洲精品午夜鲁丝片| 日本精品免费观看高清观看| 91在线观看成人| 精品一区二区三区在线播放| 国产精品毛片久久久久久| 91精品国产欧美一区二区18| 粉嫩绯色av一区二区在线观看| 国产a区久久久| 在线视频亚洲一区| 风间由美一区二区av101| 成人精品免费视频| 奇米综合一区二区三区精品视频| 亚洲欧美综合另类在线卡通| 欧美va亚洲va国产综合| 91麻豆精品在线观看| 在线免费av一区| 日韩欧美精品在线| 欧美猛男gaygay网站| 奇米影视一区二区三区小说| 91高清在线观看| 欧美日韩成人在线一区| 日韩精品一区二区三区swag | 亚洲一区二区高清| 欧美一区国产二区| 国产欧美日韩三级| 精品88久久久久88久久久| 欧美日韩在线播放一区| 色婷婷香蕉在线一区二区| 欧美精品久久99久久在免费线| 久久久亚洲综合| 一区二区成人在线视频| 亚洲免费看黄网站| 中文字幕佐山爱一区二区免费| 日韩和欧美的一区| 天堂精品中文字幕在线| 国产成人av一区| 成人免费福利片| 欧美一级在线观看| 一区二区三区日韩欧美| 国产成人8x视频一区二区 | 精品国产伦一区二区三区观看方式 | 免费xxxx性欧美18vr| 丁香婷婷深情五月亚洲| 欧美一区二区大片| 亚洲一区av在线| av电影在线观看一区| 国产成人精品免费一区二区| 欧美日韩久久一区| 亚洲精品中文在线观看| 日韩黄色在线观看| 在线观看亚洲成人| 亚洲欧美日韩人成在线播放| 国产成人免费视频网站高清观看视频 | 日本女优在线视频一区二区| 欧洲另类一二三四区| 亚洲免费av高清| 99国产精品视频免费观看| 色悠悠久久综合| 中文字幕成人网| 成熟亚洲日本毛茸茸凸凹| 久久精品一级爱片| 国产91在线看| 欧美激情中文不卡| 99精品1区2区| 亚洲一区二区三区美女| 日本高清不卡一区| 亚洲国产日日夜夜| 高清不卡一二三区| 国产精品国产三级国产a| 成人精品电影在线观看| 欧美日韩第一区日日骚| 香蕉加勒比综合久久| 成人av中文字幕| 亚洲天堂精品视频| 欧美私模裸体表演在线观看| 久久久91精品国产一区二区精品| 国产原创一区二区三区| 欧美日韩性生活| 日韩 欧美一区二区三区| 日韩欧美电影在线| 国产高清在线观看免费不卡| 国产精品久久久久久亚洲毛片| 91啪亚洲精品| 蜜臀91精品一区二区三区 | 日韩欧美成人一区二区| 国产精品一区二区三区网站| 国内国产精品久久| 日韩影院在线观看| 在线免费亚洲电影| 午夜精品一区二区三区三上悠亚| 黄页视频在线91| 国产日韩欧美精品综合| 色婷婷一区二区| 美腿丝袜在线亚洲一区| 国产丝袜欧美中文另类| 欧美亚洲国产bt| 国产乱码精品1区2区3区| 亚洲欧洲三级电影| 在线不卡一区二区| 成人av小说网| 日韩不卡一二三区| 日韩毛片视频在线看| 欧美一卡二卡三卡| 色老汉一区二区三区| 韩日av一区二区| 日韩限制级电影在线观看| 欧美一区二区三区白人| 国产经典欧美精品| 亚洲成人av一区二区| 亚洲欧美一区二区不卡| 欧美美女一区二区三区| 99久免费精品视频在线观看| 精品亚洲欧美一区| 日韩专区一卡二卡| 亚洲日本免费电影| 国产色产综合产在线视频| 欧美精品视频www在线观看| a4yy欧美一区二区三区| 国产一区二区三区在线观看免费视频 | 99re成人精品视频| 狠狠色丁香婷综合久久| 午夜精品久久久久久久99水蜜桃| 中文字幕精品综合| 久久亚洲综合色一区二区三区| 美女国产一区二区三区| 亚洲女与黑人做爰| 亚洲国产成人私人影院tom| 欧美一区二区精品久久911| 欧美视频三区在线播放| 99久久精品国产毛片| 国产91精品露脸国语对白| 美国毛片一区二区三区| 免费一区二区视频| 日本欧美一区二区| 蜜桃av一区二区三区电影| 亚洲国产精品嫩草影院| 亚洲一级片在线观看| 亚洲自拍偷拍欧美| 亚洲精品乱码久久久久久黑人| 亚洲天堂福利av| 亚洲一区二区综合| 亚洲永久免费av| 亚洲一区二区精品视频| 水蜜桃久久夜色精品一区的特点| 日韩av一区二区在线影视| 美女网站在线免费欧美精品| 美洲天堂一区二卡三卡四卡视频| 黑人巨大精品欧美一区| 国产成人免费视频网站高清观看视频| 国产成人在线观看免费网站| 成人国产精品免费| 色偷偷88欧美精品久久久| 精品视频一区二区不卡| 日韩欧美国产综合一区 | 亚洲精品乱码久久久久久黑人| 亚洲品质自拍视频网站| 亚洲综合免费观看高清完整版在线 | 久久久久久久久久久久电影| 中文一区一区三区高中清不卡| 国产精品国产馆在线真实露脸 | 精品夜夜嗨av一区二区三区| 丁香婷婷综合激情五月色| 99精品久久免费看蜜臀剧情介绍 | 蜜臀av一级做a爰片久久| 国产一区二区精品在线观看| 不卡一区二区在线| 欧美撒尿777hd撒尿| 久久亚洲精精品中文字幕早川悠里| 国产精品视频你懂的| 亚洲成人在线网站| 国产91精品久久久久久久网曝门| 久久综合色一综合色88| 国产高清不卡一区二区| 国产黄色精品网站| 91福利国产成人精品照片| 欧美挠脚心视频网站| 久久久噜噜噜久久人人看| 亚洲精品一卡二卡| 国产综合色精品一区二区三区| 色综合视频在线观看| 精品国产1区二区| 亚洲成人黄色影院| 99久久精品免费| 日韩欧美色综合网站| 一区二区三区欧美亚洲| 高清成人免费视频| 日韩一区二区三区在线观看| 亚洲欧美一区二区视频| 国产精品99久久久久久久vr|