根据多个连接条件从两个自定义列表中选择项目

时间:2013-07-22 16:19:53

标签: c# linq

我必须自定义数据列表:

    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 - 但是这会很慢

然而这并没有奏效,远非优雅! ... :) 任何指针都会非常感激。

由于

2 个答案:

答案 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)传递。如果您无法控制DatType1DatType2类型,则后者可能是理想的。