2013-07-17 476 views
1

因此,目前有一個比較項目正在處理中,我收到了需要比較的兩類信息的列表。我正在使用C#編寫這個項目,並將其顯示在MVC網頁上。我更喜歡C#,並且對web開發人員來說是全新的。比較元素屬性

我知道我可以寫出來的一個接一個的元素

EX比較:

List<ESHClass> eshlist; //This just to show that eshlist is of type ESHClass and i'm 
           purposefully comparing two elements from the same list 

    bool pNum = eshlist[0].PolicyNumber == eshlist[1].PolicyNumber; 

但我不知道是否有任何更有效的方式做到這一點在C# ? 我需要一一比較,因爲我只會顯示不同的字段。 我瀏覽了一下網絡,但並沒有完全找到我要找的東西。如果您有任何好的提示或文章可以讓我朝更好的方向發展,我會很感激!


澄清:

我寫信澄清我想用我的工具完成的任務。

我將有一個類類型(如ESHCLASS)列表

List<ESHClass> eshlist; 

而且ESHClass組成元素,如:

public class ESHClass{ 
    public string PolicyNumber; 
    public string PolicyMod; 
    public string MultiPolicy; 
    public string HasSwimmingPool; 
}; 

所以說eshlist有政策(ESHClass)和有值等於:

eshlist[0].PolicyNumber= "7"; 
eshlist[0].PolicyMod= "00"; 
eshlist[0].MultiPolicy= "Yes"; 
eshlist[0].HasSwimmingPool= "No"; 

eshlist[1].PolicyNumber= "7"; 
eshlist[1].PolicyMod= "00"; 
eshlist[1].MultiPolicy= "No"; 
eshlist[0].HasSwimmingPool= "Yes"; 

所以我想要做的就是以抽象的方式和存儲的每個元素進行比較只有那些不同的,並顯示他們在我的網站,目前設置爲MVC ListView(顯示不是我遇到麻煩的部分)。

所以在我的例子情況下,網站會顯示:

MultiPolicyMultiPolicy沒有

HasSwimmingPool沒有HasSwimmingPool

+0

我猜你的意思是'... [0] ... == ... [1] ...' –

+1

檢查這個http://stackoverflow.com/questions/3669970/compare-two-listt-object等於無視秩序 –

+1

@juleekwin我認爲這是一個很好的問題,它是一個錯誤的標題:它不是關於他們在列表中的事實,而是關於有兩個對象,並希望看到哪些屬性不同。我不確定一個更好的標題會是什麼。 –

回答

0

你的問題是有點曖昧與你正在比較的東西。如果我正確解釋它,你有一個列表,你想從中獲得唯一的值。因此,您可以使用eshlist.Distinct()僅返回唯一元素。如果需要,你可以在自定義比較傳遞以及因此,如果你想獲得通過PolicyNumber不同元素,你可以這樣做:

eshlist.Select(x => x.PolicyNumber).Distinct() 
0

不涉及寫出的東西任何一個方法逐最有可能包括反思。這在某些方面更好,但通常不是我的第一選擇。

你所得到的可能是我認爲最好的通用方法:沒有魔法字符串,速度非常快,而且閱讀起來比較簡單。唯一主要的缺點是,包括財產,比較不同財產或濫用產生的bool會相當容易。

取決於你有知識,其中性質不同的事,這樣的事情會是個不錯的類,包括你在這裏比較:

public class MyClass { 
    public IEnumerable<string> GetDifferingPropertyNames(MyClass other) { ... } 
} 

這可能與實現一個接一個的方法類似於你所得到的(但是被包含在定義屬性的類中是更好的,因爲例如,如果你添加一個屬性,你只需要記住改變該方法,而不是另一個文件中的東西)或使用反射,例如類似於Comparing object properties in c#中的解決方案。但不是隻關心整個對象是否相等,而是列出哪些屬性不相等。

0

要獲取兩個對象之間不同的所有屬性,可以使用反射。反射可以讓你得到兩種類型的所有屬性,讓你得到該類型的兩個實例的屬性值,然後你可以比較它們,指出哪些屬性具有不同的值。

此方法使用泛型來確保給出的兩個實例的類型相同,否則比較無意義。

public static IEnumerable<PropertyInfo> GetDifferentProperties<T>(T first, T second) 
{ 
    return typeof(T).GetProperties().Where(prop => 
     !object.Equals(prop.GetValue(first), prop.GetValue(second))); 
} 

從這個方法調用的結果,你可以走出屬性Name作爲一個字符串,你可以用它來獲取性能對於那些和其他情況下的值,並且相當多的多爲好。

0

讓我們假設你有一個類似的策略列表的東西:

 var policies = new List<Policy> 
         { 
          new Policy { PolicyNumber = "policy1" }, 
          new Policy { PolicyNumber = "policy2" } 
         }; 
     policies.Add(policies[0]); //The list contains a duplicate element! (here policy1) 

你可以這樣做:

 var ignoreList = new List<Policy>(); 
     var distinctList = new List<Policy>(); 


     policies.ForEach(policy => 
       { 
        if (!ignoreList.Contains(policy)) distinctList.Add(policy); 
        if (policies.FindAll(t => t.Equals(policy)).Count > 0) ignoreList.Add(policy); 
       }); 

甚至連簡單的,

var distinctPolicies = policies.Distinct() does the job! 
+0

在我看來,它似乎在檢查整個政策,以確定它是不同的。我正在尋找政策中的個別元素。因此,如果兩個元素之間的policymod不同,它只是捕獲要顯示的內容而不是整個策略類。我在帖子底部添加了一個說明。 – juleekwin