2013-07-17 271 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