首页 > 解决方案 > c# 交叉连接两个相同类型的列表

问题描述

所以这里我有一些代码,可以正常工作。但是我想将select部分更改为其他内容,我不确定我可以使用哪些其他方法来获得任何帮助。

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var all = new List<People>{new People{Id = 1, Name = "andy1", Age = null}, new People{Id = 2, Name = "andy2", Age = null}, new People{Id = 3, Name = "andy3", Age = null}, new People{Id = 4, Name = "andy4", Age = null}, };
        var someOfThem = new List<People>{new People{Id = 1, Name = null, Age = 1}, new People{Id = 2, Name = null, Age = 1},new People{Id = 3, Name = null, Age = 1}};
        var test = someOfThem.Select(c =>
        {
            c.Name = all.Find(a => a.Id == c.Id).Name;
            return c;
        });
        foreach (var item in test)
            Console.WriteLine("{0}={1}={2}", item.Id, item.Name, item.Age);
    }
}

public class People
{
    public int Id
    {
        get;
        set;
    }

    public int? Age
    {
        get;
        set;
    }


    public string Name
    {
        get;
        set;
    }
}

这是结果。

1=andy1=1
2=andy2=1
3=andy3=1

我只是想知道是否有另一种方法可以达到相同的结果但更优雅的方式?还是更简单的方法?

        var test = someOfThem.Select(c =>
        {
            c.Name = all.Find(a => a.Id == c.Id).Name;
            return c;
        });

更新 对不起,我一开始没有正确显示我的问题,我已经更新了我的问题。请再看看。

标签: c#.netlinq.net-corelinq-to-entities

解决方案


您可以使用 C# 的 LINQ 关键字,更具体地说,可以使用join与之相关的关键字:

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var all = new List<People> { new People { Id = 1, Name = "andy1", }, new People { Id = 2, Name = "andy2", }, new People { Id = 3, Name = "andy3", }, new People { Id = 4, Name = "andy4", }, };
        var someOfThem = new List<People> { new People { Id = 1, Name = null, }, new People { Id = 2, Name = null, } };
        var test = from item in someOfThem
                   join element in all on item.Id equals element.Id
                   select element;

        foreach (var item in test)
            Console.WriteLine("{0}={1}", item.Id, item.Name);
    }
}

public class People
{
    public int Id
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }
}

代码版本将是

var test = someOfThem.Join(all, item => item.Id, element => element.Id, (item, element) => element);

如罗伯特的评论所示


推荐阅读