如何使用泛型将X列表与C#中的Y列表进行比较?

Ano*_*ous 4 .net c# generics list

我有两个类,X和Y.这两个类具有相同的类似属性,如下所示.

class X
{
    public string T1 { get; set; }
    public string T2 { get; set; }
    public string T3 { get; set; }
}

class Y
{
    public string T1 { get; set; }
    public string T2 { get; set; }
    public string T3 { get; set; }

    public string O1 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有几百个类似于X和Y的类; 类似的结构,我决定为这个问题创建泛型类.

我有X和Y的列表,我想用T1比较它们; 只有1个属性,找出两个列表中存在哪个元素,哪个元素仅存在于X上且仅存在于Y上.

我怎样才能做到这一点?

Abe*_*bel 7

最好的办法是首先创建一个T1仅包含的接口.然后,你继承每个类像X,并Y从该接口.现在,您可以基于此接口轻松创建泛型类或任何帮助程序类.

或者,您可以使用反射,或者如果您使用C#4.0,则可以使用dynamic.经典反射是减慢(大)列表的方法,因此除非您缓存方法调用,否则不应采用该方法.然而,C#4.0提供了通过DLR的方法缓存,这在大多数情况下足够快.

或者(2):当您想要"正确"执行此操作并且希望使用LINQ等标准机制比较列表时,您应该实现IComparable.您可以将其与泛型组合以创建类型安全性.

// the interface, inherit from IComparable
public interface IX : IComparable<IX>
{
    string T1 { get; set; }
}

// create one base class
class XBase : IX
{
    public string T1 { get; set; }
    public int CompareTo(IX obj)
    {
        return this.T1.equals(obj.T1);
    }
}

// inherit all others from base class
class X : XBase
{
    public string T2 { get; set; }
    public string T3 { get; set; }
}

class Y : XBase
{
    public string T2 { get; set; }
    public string T3 { get; set; }

    public strign O1 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

还有很多其他方法.上面的最后一个方法的优点是只有一次为逻辑编写T1CompareTo,这样可以避免混乱,并在代码中创建清晰度.

  • 你真的测量过反射与动态吗? (2认同)