从自定义类数组中包含的Object []中删除项目

时间:2011-08-09 14:31:13

标签: c# arrays linq list

我有一个自定义项目数组,然后我有一个对象数组[],由函数返回。此对象数组确实具有相同的客户端类型,但它作为对象类型的数组返回(我无法编辑此方面)。

我尝试使用显式转换,但是我在运行时遇到异常:无法将object []转换为clients []。
我的目标,一旦我有两个数组,就是从一个列表中删除另一个列表中存在的项并建立一个联合,以便拥有一个唯一的列表。

var client = getClients().ToArray();           //Is an array of Clients[]
var normalSearch = getDuplicates().ToArray();  //Is an array of object[]


//This what I try to achieve,but being object, I cannot invoke "c.ContactId" (Line 4)
var uni = (from c in normalSearch
           where !(from d in dupes
                   select d.ContactId)
                   .Contains(c.ContactId)
           select c).ToArray();

我知道在Linq Union()中可以排除在使用基本类型时自动复制,否则必须使用自定义类型开发扩展。但我无法访问其余的代码,因此无法在其他地方更改逻辑。

3 个答案:

答案 0 :(得分:1)

var uni = client.Union(normalSearch.Cast<Client>())
    .DistinctBy(c => c.ContractId);

DistinctBy位于MoreLinq

如果你不能使用MoreLinq,你可以简单地做

var uni = client.Union(normalSearch.Cast<Client>())
    .GroupBy(c => c.ContractId)
    .Select(g => g.First());

基本上就是它们的实现。

答案 1 :(得分:1)

getDuplicates().Cast<Client>();

答案 2 :(得分:0)

您可以使用linq将重复项转换为客户端,然后创建一个比较器类。我从msdn documentation复制并粘贴了它,可能需要进行调整

var normalSearch = getDuplicates().ToArray().Cast<Clients>();
var client = getClients().ToArray();

var unique = client.Union(normalSearch, new ClientsComparer());

public class ClientsComparer : IEqualityComparer<Clients>
{
    public bool Equals(Clients x, Clients y)
    {

        //Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        //Check whether the products' properties are equal.
        return x.ContactId == y.ContactId;
    }

    // If Equals() returns true for a pair of objects 
    // then GetHashCode() must return the same value for these objects.

    public int GetHashCode(Client client)
    {
        //Check whether the object is null
        if (Object.ReferenceEquals(product, null)) return 0;

        //Calculate the hash code for the product.
        return client.ContactId.GetHashCode();
    }

}