正在比较元素属性

本文关键字:属性 元素 比较 | 更新日期: 2023-09-27 18:22:48

因此,目前我正在进行一个比较项目,我收到了一份列表,其中包含我需要比较的两类信息。我正在用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(显示不是我遇到的问题)。

所以在我的例子中,网站会显示:

多策略是多政策无

HasSwimmingPool否HasSwimmingPool是

正在比较元素属性

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

在我看来,你所拥有的可能是最好的通用方法:没有魔术串,性能非常快,而且读起来相当简单。唯一的主要缺点是,它很容易错过包含属性、比较不同的属性或滥用生成的bool

根据你对哪些属性不同的了解,在这里比较的类中包含这样的内容可能会很好:

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

这可以用类似于您所拥有的逐个方法来实现(但包含在定义属性的类中更好,因为例如,如果添加属性,您只需要记住更改该方法,而不需要更改另一个文件中的内容),或者使用反射,例如类似于c#中比较对象属性中的解决方案的方法。但是,与其只关心整个对象是否相等,不如列出哪些属性不相等。

要获得两个对象之间不同的所有属性,可以使用反射。反射可以获得两种类型的所有属性,让你获得该类型的两个实例的该属性的值,然后你可以对它们进行比较,指示哪些属性具有不同的值。

该方法使用泛型来确保给定的两个实例的类型相同,否则比较就没有意义。

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作为字符串输出,还可以使用它来获取这些实例和其他实例的属性值,以及更多。

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

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

让我们假设您有一个类似于以下内容的策略列表:

        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!