0

昨天我几乎问过这个问题,但我将把它作为一个新问题进行改革,并且更加具体。

这是我昨天问的问题。

我有一个类类型列表(例如 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";

所以我有两个我的 ESHClass 实例,数据已经设置并且它们被存储在eshlist.

下一部分是我的另一篇文章引起注意的地方。我想比较以下对象:

eshlist[0].PolicyNumber == eshlist[1].PolicyNumber //I know this isn't correct code its 
                                                   //just to show how I would compare.

eshlist[0].HasSwimmingPool == eshlist[1].HasSwimmingPool

然后,如果我要比较的两个对象不同,我想将它们保存在一个列表中,以便在我使用 MVC 4 制作的网页上打印它们,并且该页面是一个 ListView。

我昨天的帖子是在询问更多关于以最有效的方式执行此操作的信息……今天我开始思考它,我想知道我是否真的能够摆脱为每个元素做这件事……现在这是现在我正在这样做:

public List<ESHList> Compare(List<ESHClass> polList)
        {
            var l = polList;
            if (l[0].PolicyNumber.Equals(l[1].PolicyNumber))
                l[0].PolicyNumber = l[1].PolicyNumber = null;
            if (l[0].HasSwimmingPool.Equals(l[1].HasSwimmingPool))
                l[0].HasSwimmingPool = l[1].HasSwimmingPool= null;
    }

所以所有相等的元素都被清空,并且列表中只返回不同的元素。这是我调用比较方法的地方:

索引.cshtml:

{
 ...
 return View((esh.Compare(eshList)).DefaultIfEmpty());
}

因此,现在在展示了更详细的解释之后,您是否认为有一种方法可以摆脱一长串的如果,或者只是一种更好的方法来做我今天正在尝试的事情,但将结果保留在我可以打印在屏幕上的列表中?正如我在另一篇文章中所说,我对 C# 较新,对 Web 编程完全陌生。如果您有任何有用的答案或我可以参考的文章,请告诉我!谢谢!

编辑: 只是用我的例子来展示我的屏幕将显示什么

政策1

PolicyModHasSwimmingPool

政策2

PolicyModHasSwimmingPool

4

4 回答 4

1

做到这一点的最好方法是ESHClass知道如何比较自己是否相等。

请参阅此链接以获取相当深入的示例,或查看此问题以获取更小的集合。

基本上,您为代码提供了足够的信息以便能够eshlist[0] == eshlist[1]直接评估。

于 2013-07-18T16:09:56.117 回答
1

当您想正确比较复杂对象的两个实例时(因为您可能在 Equals 的重载中实现),我认为您无法摆脱“一长串 ifs”。但是,请记住以下几点:

C# 中的逻辑表达式(例如 if 语句的条件)不会执行不必​​要的求值,即它在确定结果后立即停止求值。

例如:

if (a && b && c) // won't evaluate b or c if a is false, won't evaluate c if b is false

或者:

if (a || b || c) // won't evaluate b or c if a is true, won't evaluate c if b is true

因此,您可以将成员比较编写为一个大表达式,例如:

return ((this.a == that.a) && (this.b == that.b) && (this.c == that.c) /*... etc */);

...并且您可以肯定,如果第一项为假,则甚至不会执行大多数比较。

也许这会给你一些指导以找到适当的解决方案。

于 2013-07-18T16:29:14.593 回答
0

一个好的开始是修改你ESHClass的实现IComparable

public class ESHClass : IComparable<ESHClass> {

  public ESHClass() {
    TimeStamp = DateTime.MinValue;
  }

  public string PolicyNumber { get; set; }
  public string PolicyMod { get; set; }
  public string MultiPolicy { get; set; }
  public string HasSwimmingPool { get; set; }
  public DateTime TimeStamp { get; set; }

  public int CompareTo(ESHClass other) {
    int value = PolicyNumber.CompareTo(other.PolicyNumber);
    if (value == 0) {
      value = TimeStamp.CompareTo(other.TimeStamp);
    }
    return value;
  }

  public override string ToString() {
    return PolicyNumber;
  }

}

现在,为了给这个类一些马力,你可以修改它以包含几个const应该为你的程序设置的字段和一个static完成所有工作的方法:

private const string DEFAULT_FOLDER = @"C:\TEMP";
private const string FILE_EXTENSION = "*.xml";

public static ICollection<ESHClass> SortedPolicies() {
  var list = new List<ESHClass>();
  var dir = new DirectoryInfo(DEFAULT_FOLDER);
  foreach (var file in dir.GetFiles(FILE_EXTENSION)) {
    using (var xmlReader = System.Xml.XmlReader.Create(file.FullName)) {
      var esh = new ESHClass() { TimeStamp = file.CreationTime };
      try {
        while (xmlReader.Read()) {
          if (xmlReader.IsStartElement()) {
            switch (xmlReader.Name) {
              case "PolicyNumber":
                esh.PolicyNumber = xmlReader.Value;
                break;
              case "PolicyMod":
                esh.PolicyMod = xmlReader.Value;
                break;
              case "MultiPolicy":
                esh.MultiPolicy = xmlReader.Value;
                break;
              case "HasSwimmingPool":
                esh.HasSwimmingPool = xmlReader.Value;
                break;
            }
          }
        }
        list.Add(esh);
      } catch (Exception err) {
        throw err;
      } finally {
        xmlReader.Close();
      }
    }
  }
  list.Sort();
  return list;
}

当然,您需要修改它以匹配您的 XML 结构!

这可能是完整的类,全部融合在一起:

public class ESHClass : IComparable<ESHClass> {

  private const string DEFAULT_FOLDER = @"C:\TEMP";
  private const string FILE_EXTENSION = "*.xml";

  public ESHClass() {
    TimeStamp = DateTime.MinValue;
  }

  public string PolicyNumber { get; set; }
  public string PolicyMod { get; set; }
  public string MultiPolicy { get; set; }
  public string HasSwimmingPool { get; set; }
  public DateTime TimeStamp { get; set; }

  public int CompareTo(ESHClass other) {
    int value = PolicyNumber.CompareTo(other.PolicyNumber);
    if (value == 0) {
      value = TimeStamp.CompareTo(other.TimeStamp);
    }
    return value;
  }

  public override string ToString() {
    return PolicyNumber;
  }

  public static ICollection<ESHClass> SortedPolicies() {
    var list = new List<ESHClass>();
    var dir = new DirectoryInfo(DEFAULT_FOLDER);
    foreach (var file in dir.GetFiles(FILE_EXTENSION)) {
      using (var xmlReader = System.Xml.XmlReader.Create(file.FullName)) {
        var esh = new ESHClass() { TimeStamp = file.CreationTime };
        try {
          while (xmlReader.Read()) {
            if (xmlReader.IsStartElement()) {
              switch (xmlReader.Name) {
                case "PolicyNumber":
                  esh.PolicyNumber = xmlReader.Value;
                  break;
                case "PolicyMod":
                  esh.PolicyMod = xmlReader.Value;
                  break;
                case "MultiPolicy":
                  esh.MultiPolicy = xmlReader.Value;
                  break;
                case "HasSwimmingPool":
                  esh.HasSwimmingPool = xmlReader.Value;
                  break;
              }
            }
          }
          list.Add(esh);
        } catch (Exception err) {
          throw err;
        } finally {
          xmlReader.Close();
        }
      }
    }
    list.Sort();
    return list;
  }

}
于 2013-07-18T17:17:32.137 回答
0

经过大量研究,我最终使用了我最初所说的一系列 if 语句。虽然感觉很恶心!:( 那好吧!

于 2013-07-29T17:22:42.133 回答