正在比较元素属性
本文关键字:属性 元素 比较 | 更新日期: 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!