我有一个自定义项目数组,然后我有一个对象数组[],由函数返回。此对象数组确实具有相同的客户端类型,但它作为对象类型的数组返回(我无法编辑此方面)。
我尝试使用显式转换,但是我在运行时遇到异常:无法将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()中可以排除在使用基本类型时自动复制,否则必须使用自定义类型开发扩展。但我无法访问其余的代码,因此无法在其他地方更改逻辑。
答案 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();
}
}