簡體   English   中英

比較來自Class的兩個實例的對象並將結果存儲在List中<class>

[英]Comparing objects from two instances of a Class and storing result in List<class>

我昨天幾乎問了這個問題,但我將把它作為一個新問題進行改革,並且更加具體。

這是我昨天問的問題。

我有一個類類型列表(例如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;
    }

因此,所有相等的元素都被清零,並且列表中只返回不同的元素。 這是我調用Compare方法的地方:

Index.cshtml:

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

所以現在在顯示更詳細的解釋之后,您認為有一種方法可以擺脫一系列ifs,或者只是更好的方式來做我今天正在嘗試的事情,但是將結果保存在我可以在屏幕上打印的列表中嗎? 正如我在其他帖子中所說的,我是C#的新手,也是網絡編程的新手。 如果您有任何有用的答案或文章我可以參考,請告訴我! 謝謝!

編輯:只是用我的例子展示我的屏幕將顯示什么

策略1

PolicyModHasSwimmingPool沒有

策略2

PolicyModHasSwimmingPool是的

最好的方法是讓ESHClass知道如何比較自己的平等性。

請參閱此鏈接以獲取相當深入的示例,或針對更小的集合查看此問題

基本上,您可以為代碼提供足夠的信息,以便能夠直接評估eshlist[0] == eshlist[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 */);

......如果第一個術語是假的,你肯定大多數的比較都不會被執行。

也許這會為您提供適當解決方案的指導。

一個好的開始是修改您的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;
  }

}

經過大量的研究,我最終使用了像我最初所說的一系列if語句。 雖然感覺真好! :( 那好吧!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM