我必须自定义数据列表:
public class DatType1
{
public string yr;
public string qr;
public string mt;
public string cw;
public string tar;
public string rg;
public string mac;
public string fuel;
public double fp;
public double fi;
public double fd;
}
和
public class DatType2
{
public string yr;
public string qr;
public string mt;
public string cw;
public string tar;
public string RG;
public double pp;
public double pi;
public double fp;
public double fi;
public double fd;
}
正如您所看到的,两者之间存在很多重叠。我想将DatType1.fp,DatType1.fi,DatType1.fd的值添加到DateType2,但我需要将它们放在正确的位置,正确的位置意味着一堆项目相等。
我在网站上看了很多,但无法弄明白。我试过这样的事:
from a in TableA
from b in TableB
where a.yr==b.yr & a.qr==b.qr & a.RG == b.RG & a.tar ==b.tar
select( r=> new DatType2{....}
然后在括号中重复我要保留的DateType2中的所有内容并添加DatType1.fp,DatType1.fi,DatType1.fd。
如果我使用暴力执行此操作,我会执行双循环并遍历DatType1的每一行,并查看我在DatType2中匹配行的位置,然后添加DatType1.fp,DatType1.fi,DatType1.fd - 但是这会很慢
然而这并没有奏效,远非优雅! ... :) 任何指针都会非常感激。
由于
答案 0 :(得分:0)
我会创建一个基类,包含所有常见数据:
public class BaseClass
{
public string yr;
public string qr;
public string mt;
public string cw;
public string tar;
public string rg;
public double fp;
public double fi;
public double fd;
public void SetAllValues(BaseClass Other)
{
this.yr = Other.yr;
this.qr = Other.qr;
//til the end.
this.fd = Other.fd;
}
//with this you check the equal stuff...
public bool HasSameSignature(BaseClass Other)
{
if (this.yr != Other.yr) return false;
if (this.qr != Other.qr) return false;
//all other comparisons needed
return true;
}
//with this you set the desired ones:
public void SetDesired(BaseClass Other)
{
this.fp = Other.fp;
this.fi = Other.fi;
//all other settings needed
}
}
其他人会继承这个基础:
public class DatType1 : BaseClass
{
public string mac;
public string fuel;
}
public class DatType2 : BaseClass
{
public double pp;
public double pi;
}
现在,您可以使用a.HasSameSignature(b)
代替a.yr==b.yr & a.qr==b.qr & a.RG == b.RG & a.tar ==b.tar
。
并设置值(或根据需要创建一个复制方法)....
答案 1 :(得分:0)
我建议重载两个对象的相等比较以生成DatType1:IEquatable<DatType2>
和/或DatType2:IEquatable<DatType1>
。这样您就可以使用dat1.Equals(dat2)
或dat2.Equals(dat1)
。
或者,您可以实现比较委托,并将其作为dat1.Equals(dat2,comparer)
或comparer.Compare(dat1,dat2)
传递。如果您无法控制DatType1
或DatType2
类型,则后者可能是理想的。