比较类的两个实例中的对象并将结果存储在List<;类>;
本文关键字:存储 结果 lt gt List 对象 两个 比较 实例 | 更新日期: 2023-09-27 18:23:44
我昨天几乎问了这个问题,但我将把它作为一个新问题进行改革,并更加具体。
这是我昨天问的问题。
我有一个类类型(例如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
中。
下一部分是我的另一篇文章中提到的warry。我想比较以下对象:
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.chtml:
{
...
return View((esh.Compare(eshList)).DefaultIfEmpty());
}
所以,在展示了更详细的解释之后,你认为有没有一种方法可以摆脱一长串的如果,或者只是一种更好的方法来做我今天正在尝试的事情,同时将结果保存在我可以在屏幕上打印的列表中?正如我在另一篇文章中所说,我对C#比较陌生,对网络编程也完全陌生。如果你有任何有用的答案或文章我可以参考,请告诉我!非常感谢。
编辑:只是用我的例子来展示我的屏幕将显示什么
政策1
PolicyMod是HasSwimmingPool无
政策2
PolicyMod否HasSwimmingPool是
做到这一点的最佳方法是让ESHClass
知道如何比较自身的相等性。
请参阅此链接以获得一个相当深入的示例,或者参阅此问题以获得一组更为简单的示例。
基本上,您为代码提供了足够的信息,以便能够直接评估eshlist[0] == eshlist[1]
。
当您想要正确比较复杂对象的两个实例时(正如您可能在Equals的重载中实现的那样),我认为您无法摆脱"一长串if"。但是,请记住以下几点:
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;
}
}
现在,为了给该类一些Horsepower,您可以修改它,使其包括几个应该为程序设置的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语句,就像我最初所说的那样。不过感觉很恶心!:(哦,好吧!