1. 程式人生 > >.NET平臺開源專案速覽(2)Compare .NET Objects物件比較元件

.NET平臺開源專案速覽(2)Compare .NET Objects物件比較元件

    .NET平臺開源專案速覽今天介紹一款小巧強大的物件比較元件。可以更詳細的獲取2個物件的差別,並記錄具體差別,比較過程和要求可以靈活配置。

1.Compare .NET Objects介紹

    Compare .NET Objects元件是.NET平臺用於深入比較2個.NET物件的開源元件,一直在更新,主要功能如名字所示就是深入比較2個.NET物件,是否相等或者是否有差異。可能很多.NET物件實現了一些.NET自帶的介面可以直接進行比較,但是這個元件比較的範圍和功能更加廣泛。例如:

    可以比較預設的子節點;可以比較結構體;

    可以比較IList物件;可以比較單維或者多維的陣列物件;

    可以比較列舉型別;可以比較IDictionary物件;

    可以比較資料集,資料表,字典等等;

    可以比較私有欄位或者屬性等等。。。。。。。。

    Compare .NET Objects支援.NET 3.5及更高版本,同時也支援 Silverlight 5+, Windows Phone 8+, Windows RT 8+, Xamarin iOS, and Xamarin Android等環境。

    還有很多,不一一列舉,可以去官網詳細瞭解。我們重點放在它的基本使用上面,本文就用幾個例子帶你走近它的世界。雖然簡單,但更多複雜的功能可能會用於不同的業務場景,也許是你要的哦。。。該元件唯一的缺點是案例和文件不全面,所以我研究了一下用法,把常規的一些用法程式碼敲出來,給大家分享一下吧。

2. Compare .NET Objects注意事項

    在更好的使用Compare .NET Objects之前,需要搞清楚以下幾個注意事項,可以讓你走不少彎路,這幾個要點也是翻譯的官方網站的內容:

1.考慮到效能因素,Compare .NET Objects預設僅僅是檢測第一個差異(就可以確認不是同一個物件),如果要比較多個不同點,需要手動設定Config.MaxDifferences到你需要的不同點數量的最大值;

2.在比較完成之後,物件差異不同點在Differences 列表 或者從DifferencesString 屬性中獲取;

3.預設情況下,是進行深度比較,如果只需呀執行淺比較,需要手動設定CompareChildren =false;

4.預設情況下,私有屬性和私有欄位是不比較的,如果需要進行比較,在比較之前要設定Config.ComparePrivateProperties 和Config.ComparePrivateFields 為true;

5.預設情況下,如果比較的2個物件的型別不同,是會丟擲異常的,如果需要忽略這個因素,需要設定Config.IgnoreObjectTypes=true;

    可見該元件的功能不僅完善,而且相對靈活,把你想要的和不想要的都靈活進行了考慮,通過設定不同的開關進行比較。

3.一個簡單的使用案例

    為了使得下面的原始碼介紹更清晰,先看一個簡單使用的Demo,理解完Demo後,我們再反過來深入的介紹比較過程中的三大核心物件。理解了這三大核心物件,整個元件的邏輯和使用也基本清楚了。

3.1 首先定義一個Person型別

    為了簡單的比較,我們定義1個Person型別,包括名稱,年齡和建立日期3個屬性。如下面程式碼:

public class Person
{
	public String Name { get; set; }
	public Int32 Age { get; set; }
	public DateTime DateCreated { get; set; }
}

3.2 比較測試Demo

    首先要引用Compare-NET-Objects的dll,新增之後,要在Demo中新增名稱空間的引用:

using KellermanSoftware.CompareNetObjects;

    接下來就看核心的使用過程,看程式碼註釋:

//建立比較物件的型別
CompareLogic compareLogic = new CompareLogic();

//建立2個不同的Person型別
Person person1 = new Person();
person1.DateCreated = DateTime.Now;
person1.Name = "Jorn";
person1.Age = 25;

Person person2 = new Person();
person2.Name = "Greg";
person2.DateCreated = DateTime.Now;
person2.Age = 22;

//設定比較物件的配置檔案,最大不同點為3
compareLogic.Config.MaxDifferences = 3;            

//獲取比較結果,使用Compare方法
ComparisonResult result = compareLogic.Compare(person1, person2);

//如果不相等,輸出不同資訊字串
if (!result.AreEqual)
	Console.WriteLine(result.DifferencesString);

    如上面案例所示,整個過程有3個核心的相關物件和要點:

  1. CompareLogic物件的初始化;

  2. CompareLogic的配置設定的使用;實際上是ComparisonConfig類的設定

  3. 直接獲取結果,並輸出不同資訊,實際是ComparisonResult的使用。

    上面只是一個簡單的案例,要想深入瞭解使用,還得看看這3個主要物件的作用。

4.三大核心物件介紹

    根據第3節的例子和過程,本節介紹3個核心型別的結構,在使用前搞懂他們的結構,可以更快的使用。由於本元件暫時沒有提供幫助文件,所以我將這3個核心類的註釋進行了翻譯,並根據文章的註釋手動製作一份CHM格式的幫助文件。

4.1 CompareLogic比較邏輯類

    CompareLogic就是比較物件主要物件。它只包括2個核心的東西:

  1. 就是配置屬性Config,這是個進行比較前最重要的設定,同時在CompareLogic初始化時,也可以使用ComparisonConfig傳遞引數進行初始化,這樣就可以更簡單,在某些情況下,不需要重複設定。採用統一的配置就可以了。如下面是的部分原始碼:

    public class CompareLogic : ICompareLogic
    {
    	/// <summary>預設的比較設定檔案</summary>
    	public ComparisonConfig Config { get; set; }
    
    	/// <summary>預設建構函式</summary>
    	public CompareLogic()
    	{
    		Config = new ComparisonConfig();
    	}
    
    	/// <summary>使用外部的比較設定物件來進行初始化</summary>
    	/// <param name="config">外部設定物件</param>
    	public CompareLogic(ComparisonConfig config)
    	{
    		Config = config;
    	}
    	..........
    }
  2. 比較方法。返回一個ComparisonResult物件,這裡設計到核心的比較方法的過程,就不追究了。

    所以上述Config屬性我們在執行比較方法前,需要根據自己的需求進行設定,比如設定最大的不同數目等等。。比較方法很簡單,核心在與返回的型別,接下來繼續看。

4.2 ComparisonConfig比較配置類

    比較配置類,在CompareLogic是作為一個屬性,可以在程式中比較前進行設定的。其核心方法就是配置專案,例如,我將其核心程式碼貼出來,看一下,就一目瞭然了,這個元件要實現的不同條件下進行比較的效果和功能,就是靠這個配置來進行的。

/// <summary>
/// 時間日期型別不同(間隔)的最大毫秒數,預設為0:
/// 意思就是比較2個時間物件,差別在這個值以下,就認為是相同的,類似Double處理相等時的精度
/// </summary>
public int MaxMillisecondsDateDifference { get; set; }

/// <summary>結構體比較的最大深度(比較子節點),預設為2</summary>
public int MaxStructDepth { get; set; }

/// <summary>如果為true,遇到未知的物件型別時,將忽略,而不是直接丟擲異常,預設為false,也就是丟擲異常</summary>
public bool IgnoreUnknownObjectTypes { get; set; }

/// <summary>如果為true,將跳過無效的索引。預設為false</summary>
public bool SkipInvalidIndexers { get; set; }

/// <summary>在每個階段比較後都顯示記錄,預設為false.這在除錯很具有很深子節點的物件時非常有用</summary>
public bool ShowBreadcrumb { get; set; }

/// <summary>比較中需要忽略的型別列表.預設比較多有的型別</summary>
public List<Type> ClassTypesToIgnore { get; set; }

/// <summary>只需要比較的型別列表。預設是比較多有型別,如果設定這個列表,那將只比較這個列表中的型別</summary>
public List<Type> ClassTypesToInclude { get; set; }

/// <summary>比較期間需要忽略的資料表名稱,或者表列名稱,屬性,或者欄位。對大小寫敏感</summary>
/// <example>MembersToIgnore.Add("CreditCardNumber")</example>
public List<string> MembersToIgnore { get; set; }

/// <summary>只比較列表中的名稱,如資料表,列名稱,屬性或者欄位,大小寫敏感。和上面的型別處理類似。</summary>
/// <example>MembersToInclude.Add("FirstName")</example>
public List<string> MembersToInclude { get; set; }
...................

    其他還有很多,詳細看我提供的原始碼。我對幾個核心類進行了翻譯,可以更快的進行使用和理解。

4.3 ComparisonResult比較結果類

    比較結果也很重要,如果只是想簡單的返回相等和不相等其實太容易了,這也是這個功能元件不一樣的地方。它將結果和不同點都進行了考慮,可以在比較完成後查詢到不同點這個物件,或者直接 的字串,並將不同點的值也表現出來。使用它,主要注意3個 屬性:

/// <summary>比較發現的不同點</summary>
public List<Difference> Differences { get; set; }
/// <summary>比較不同點,以字串描述</summary>
public string DifferencesString{get ;}
/// <summary>如果相同則返回true</summary>
public bool AreEqual{get ;}

    這在Demo程式碼中也有用到。除錯的時候,大家看一看,如下圖所示:

blob.png

今天的內容就介紹到此。

5.資源

  我文中的演示Demo及專案的翻譯部分,這裡也提供一個下載,日期是在2015-5-22下載的基礎上修改的。

  我手動製作了一個部分翻譯後的元件幫助文件,如下圖:

相關推薦

.NET平臺開源專案(2)Compare .NET Objects物件比較元件

    .NET平臺開源專案速覽今天介紹一款小巧強大的物件比較元件。可以更詳細的獲取2個物件的差別,並記錄具體差別,比較過程和要求可以靈活配置。 1.Compare .NET Objects介紹     Compare .NET Objects元件是.NET平臺用於深入比較2個.NET物件的開源元

.NET平臺開源專案(14)最快的物件對映元件Tiny Mapper

    好久沒有寫文章,工作甚忙,但每日還是關注.NET領域的開源專案。五一休息,放鬆了一下之後,今天就給大家介紹一個輕量級的物件對映工具Tiny Mapper:號稱是.NET平臺最快的物件對映元件。那就一起看看呢。 臨時更新:感謝@ 的意見,為了避免新手誤解,這裡說明一下,Tiny Mappe

.NET平臺開源專案(1)SharpConfig配置檔案讀寫元件

在.NET平臺日常開發中,讀取配置檔案是一個很常見的需求。以前都是使用System.Configuration.ConfigurationSettings來操作,這個說實話,搞起來比較費勁。不知道大家有沒有同感。所以更多時候我還是喜歡使用開源的東西,更加方便簡潔,也穩定。省去自己的麻煩。今天就介紹一個非常精緻

.NET平臺開源專案(5)深入使用與擴充套件SharpConfig元件

  上個月在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧  和 .NET平臺開源專案速覽(1)SharpConfig配置檔案讀寫元件 中都提到了SharpConfig元件,簡單輕量級,速度快,而且還有比較深入的使用介紹。在文章釋出後,也有網友提到一些問題,當時我也沒仔細去分析,在這次我親

.NET平臺開源專案-最快的物件對映元件Tiny Mapper之專案實踐

心情小札:近期換了工作,苦逼於22:00後下班,房間一篇狼藉~ 小翠鄙視到:"你就適合生活在垃圾堆中!!!" 看評論也是挺有價值,同時也看到許多新手同學問道在實際專案中使用的情況。 下面就原作者的程式碼的基礎上略作調整,闡述一下在實際專案場景中的使用: 第一步:瞭解類庫方法:TinyMapper 主

.NET平臺開源專案(20)Newlife.Core中簡單靈活的配置檔案

如果用知乎,可以關注專欄: 記得5年前開始拼命翻讀X元件的原始碼,特別是XCode,但對Newlife.Core 的東西瞭解很少,最多隻是會用用,而且用到的只是九牛一毛。裡面好用的東西太多了。 最近一年時間,零零散散又學了很多,也瞭解了很多,不會寫那總要學會用吧,今天就給大家介紹裡面非常好用的自定義配置檔

.NET平臺開源專案(19)Power BI神器DAX Studio

  PowerBI更新頻繁,已經有點更不上的節奏,一直在關注和學習中,基本的一些操作大概是沒問題,更重要的是注重Power Query,M函式,以及DAX的使用,這才是核心。     上個月研究了DAX的一些語法和公式,發現這玩意看起來簡單,但其實功能非常強大,所以就想和寫程式碼一樣,弄個工具試一下。

.NET平臺開源專案(21)Cron任務排程CronNET

Quartznet大名鼎鼎應該很少有人不知道,相關的開源專案很多,不過那東東對新手來說,有點晦澀,加上哪個Cron表示式,可能一進去雲裡霧裡的。今天給大家介紹一個簡單的在.NET平臺上執行Cron計劃任務的元件CronNET。同時也給大家推介幾個Cron表示式的工具。 1.Cron介紹和工具

.NET平臺開源專案(7)關於NoSQL資料庫LiteDB的分頁查詢解決過程

  在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯) 與 .NET平臺開源專案速覽(3)小巧輕量級NoSQL檔案資料庫LiteDB中,介紹了LiteDB的基本使用情況以及部分技術細節,我還沒有在實際系統中大量使用,但文章釋出後,有不少網友( )反應在實際專案中使用過,效果還

.NET平臺開源專案(11)KwCombinatorics排列組合使用案例(1)

    今年上半年,我在KwCombinatorics系列文章中,重點介紹了KwCombinatorics元件的使用情況,其實這個元件我5年前就開始用了,非常方便,麻雀雖小五臟俱全。所以一直非常喜歡,才寫了幾篇文章推薦給大家。最近在計算足球彩票結果組合過程中,使用的到了其功能,生成排列,非常具有代表性,而且也

.NET平臺開源專案(3)小巧輕量級NoSQL檔案資料庫LiteDB

    今天給大家介紹一個不錯的小巧輕量級的NoSQL檔案資料庫LiteDB。本部落格在2013年也介紹過2款.NET平臺的開源資料庫:     上面2個數據庫我的實際的專案中用過,還不錯。當然資料量很小,主要是客戶比較變態,必須要用xml檔案儲存,就想到了,另外NDatabase只是自己覺得好玩,

.NET平臺開源專案(9)軟體序列號生成元件SoftwareProtector介紹與使用

  在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下Software Protector序列號生成元件。今天就通過一篇簡單的文章來預覽一下其強大的功能。雖然我人為其已經基本滿足了一個軟體序列號的所有要素,但至於大家用不用得上,還得看大家的需求。總的來

.NET平臺開源專案(10)FluentValidation驗證元件深入使用(二)

    在上一篇文章:.NET平臺開源專案速覽(6)FluentValidation驗證元件介紹與入門(一) 中,給大家初步介紹了一下FluentValidation驗證元件的使用情況。文章從構建間的驗證器開始,到最後的結果,以及複雜驗證等都做了比較深入的講解和使用。但其實一個完整的元件是麻雀雖小五臟俱全

.NET平臺開源專案(13)機器學習元件Accord.NET框架功能介紹

    Accord.NET Framework是在AForge.NET專案的基礎上封裝和進一步開發而來。因為AForge.NET更注重與一些底層和廣度,而Accord.NET Framework更注重與機器學習演算法以及提供計算機視訊、音訊、訊號處理以及統計應用相關的解決方案。該專案使用C#語言編寫,專

.NET平臺開源專案(8)Expression Evaluator表示式計算元件使用

  在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下Expression Evaluator驗證元件。那裡只是概述了一下,並沒有對其使用和強大功能做深入研究,所以今天就通過一篇簡單的文章來預覽一下其強大的功能。本文曾在【原創】.NET開源表示式計算元

.NET平臺開源專案(4).NET文件生成工具ADB及使用

    很久以前就使用ADB這個工具來生成專案的幫助文件。功能強大,在學習一些開源專案的過程中,官方沒有提供CHM幫助文件,所以為了快速的瞭解專案結構和註釋。就生成文件來自己看,非常好用。這也是一個學習方法吧。例如本文在:   上述2篇文章中最後的資源中就手動製作了CHM幫助文件。有時候我們還可

.NET平臺開源專案(6)FluentValidation驗證元件介紹與入門(一)

    在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下FluentValidation驗證元件。那裡只是概述了一下,並沒有對其使用和強大功能做深入研究,所以今天以及接下去的幾篇文章就專門介紹這個元件。不僅僅是它小,輕量級,優雅,而且一直在持續更新中

.NET平臺開源專案(12)雜湊演算法集合類庫HashLib

    .NET的System.Security.Cryptography名稱空間本身是提供加密服務,雜湊函式,對稱與非對稱加密演算法等功能。實際上,大部分情況下已經滿足了需求,而且.NET實現的都是目前國際上比較權威的,標準化的演算法,所以還是安全可靠的。但也有一些場合,需要自己實現一些安全雜湊演算法。

.NET平臺開源專案(18)C#平臺JSON實體類生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析複雜字串,json一定要用JsonMapper麼?中介紹了簡單的JSON解析的問題,那種方法在當時的環境是非常方便的,因為不需要生成實體類,結構很容易解析。但隨著業務的變化,也會碰到超級變態的JSON,如果還按照以前的思路,會把人搞抽風掉,一旦結構變化,又要重來。所

.NET平臺開源專案(16)C#寫PDF檔案類庫PDF File Writer介紹

    1年前,我在文章:這些.NET開源專案你知道嗎?.NET平臺開源文件與報表處理元件集合(三)中(第9個專案),給大家推薦了一個開源免費的PDF讀寫元件 PDFSharp,PDFSharp我2年前就看過,用過簡單的例子,不過程式碼沒有寫成專門的文章。最近在查詢資料的時候,又發現一款小巧的寫PDF檔案