1

所以目前我正在处理一个比较项目,我收到了一份包含我需要比较的两类信息的列表。我正在用 C# 开发这个项目,它正在 MVC 网页上显示。我是 C# 的新手,对 web 开发完全陌生。

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

前任:

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

HasSwimmingPoolHasSwimmingPool

4

4 回答 4

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

于 2013-07-17T17:40:06.083 回答
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!
于 2013-07-17T18:24:49.583 回答
0

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

eshlist.Select(x => x.PolicyNumber).Distinct()
于 2013-07-17T17:36:33.980 回答
0

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

在我看来,您所拥有的可能是最好的通用方法:没有魔术字符串,性能非常快,而且易于阅读。唯一的主要缺点是很容易错过包含属性、比较不同属性或滥用结果的bool.

根据您对哪些属性不同的知识所要做的事情,将这样的内容包含在您在此处比较的类中可能会很好:

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

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

于 2013-07-17T17:37:29.127 回答