C# 如何合并两个列表并将其合并';C语言中无重复的内部列表#
我正在尝试使用LINQ-C# 如何合并两个列表并将其合并';C语言中无重复的内部列表#,c#,linq,generic-list,C#,Linq,Generic List,我正在尝试使用LINQ- List<LinkedTable> FirstLink List<LinkedTable> SecondLink 现在FirstLink将获得所有按“TableId”分组的表,但是缺少来自SecondLink的一些“innerLinks” 我需要新合并列表中的FirstLink和SecondLink中的“innerLinks”列表,不要重复 例如: FirstLink[0].innerLinks[0] .innerLin
List<LinkedTable> FirstLink
List<LinkedTable> SecondLink
现在FirstLink将获得所有按“TableId”分组的表,但是缺少来自SecondLink的一些“innerLinks”
我需要新合并列表中的FirstLink和SecondLink中的“innerLinks”列表,不要重复
例如:
FirstLink[0].innerLinks[0]
.innerLinks[1]
.innerLinks[2]
SecondLink[0].innerLinks[1]
.innerLinks[2]
.innerLinks[3]
合并链接应为:
FirstLink[0].innerLinks[0]
.innerLinks[1]
.innerLinks[2]
.innerLinks[3]
这里有一个选项:
首先,您必须提供一种方法来告诉Linq是什么使一个链接等于另一个链接。您可以通过以下任一方法执行此操作:
- 创建一个类实现
,并将其实例作为参数传递给IEqualityComparer
李>Distinct
- 在Link类上实现
并重写IEquatable
GetHashCode
- 重写链接类上的
等于
和
李>GetHashCode
IEquatable
来实现的:
Distinct
和IEquatable
已解释覆盖
等于和GetHashCode您的查询不起作用,因为在分组时,您使用的是组的第一个元素和其链接
对象列表
要获得结果,应尝试以下代码:
FirstLink = FirstLink.Concat(SecondLink)
.GroupBy(e1 => e1.TableId)
.Select(e2 => e2.FirstOrDefault())
.ToList();
var FirstLink = FirstLink
.Concat(SecondLink)
.GroupBy(e1 => e1.TableId)
// Don't take the first item, but create a new one with the items you need
.Select(e2 => new LinkedTable
{
TableId = e2.Key,
TableName = e2.First().TableName,
innerLinks = e2.SelectMany(x => x.innerLinks).ToList()
})
.ToList();
您是否尝试过类似的foreach(SecondLink中的var项){FirstLink.Add(item);}
public class Link : IEquatable<Link>
{
public Boolean linkFlag;
public string Descriptor { get; set; }
public string RecordId { get; set; }
public bool Equals(Link other)
{
//Adjust for a suiting identifier and do all the sanity checks, if needed.
return this.RecordId == other.RecordId;
}
public override int GetHashCode()
{
//You can also use another GetHash approach that suits you better.
return this.RecordId.GetHashCode();
}
}
var merged =
from item in FirstLink.Concat(SecondLink)
group item by new { Id = item.TableId, Name = item.TableName } into tbGp
select new LinkedTable
{
TableId = tbGp.Key.Id,
TableName = tbGp.Key.Name,
innerLinks = tbGp.SelectMany(p => p.innerLinks).Distinct().ToList()
};
var FirstLink = FirstLink
.Concat(SecondLink)
.GroupBy(e1 => e1.TableId)
// Don't take the first item, but create a new one with the items you need
.Select(e2 => new LinkedTable
{
TableId = e2.Key,
TableName = e2.First().TableName,
innerLinks = e2.SelectMany(x => x.innerLinks).ToList()
})
.ToList();