比较元素属性

时间:2013-07-17 17:20:43

标签: c# list asp.net-mvc-4 comparison

所以目前我正在进行一个比较项目,我收到的列表中包含了我需要比较的两类信息。我正在使用C#处理这个项目,它正在MVC网页上显示。我是C#的新手,对web dev来说是全新的。

我知道我可以逐一写出来比较元素

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(显示不是我的部分)遇到麻烦了。)

因此,在我的示例中,网站将显示:

MultiPolicy MultiPolicy

HasSwimmingPool HasSwimmingPool

4 个答案:

答案 0 :(得分:0)

您的问题对于您所比较的内容有点模棱两可。如果我正确地解释它你有一个列表,你想从中获取唯一值。因此,您可以使用eshlist.Distinct()仅返回唯一元素。如果需要,您也可以传入自定义比较器,因此如果您想通过PolicyNumber获取不同的元素,您可以这样做:

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

答案 1 :(得分:0)

任何不涉及逐个写出事物的方法都很可能包括反思。这在某些方面更好,但通常不是我的第一选择。

在我看来,你所拥有的可能是最好的通用方法:没有神奇的字符串,非常快的性能,而且阅读起来相当简单。唯一的主要缺点是很容易错过包括属性,比较不同属性或滥用结果bool

根据您对哪些属性不同的知识所做的事情,这样的事情可能会包含在您要比较的课程中:

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

这可以通过一个一个接一个的方法实现,类似于你所拥有的(但是包含在定义属性的类中更好,因为例如,如果你添加一个属性,你只需要记住改变那个方法,而不是另一个文件中的东西),或者使用反射,例如与Comparing object properties in c#中的解决方案类似的内容。但不仅仅关心整个对象是否相等,而是列出哪些属性不相等。

答案 2 :(得分: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作为字符串取出,您可以使用它来获取这些属性和其他实例的属性值,并且可以更多好。

答案 3 :(得分: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!