Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何合并两个列表并将其合并';C语言中无重复的内部列表#_C#_Linq_Generic List - Fatal编程技术网

C# 如何合并两个列表并将其合并';C语言中无重复的内部列表#

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

我正在尝试使用LINQ-

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
假设RecordId是链接对象的唯一标识符,这是通过实现
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();