簡體   English   中英

c#交叉連接兩個相同類型的列表

[英]c# cross join two same type of lists

所以這里我有一些代碼,它工作正常。 但是我想將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# 的 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);

如羅伯特的評論所示

您可以使用 Join(您也可以使用字典,但我不會展示它):

下面是 join 的語法:

var test = someOfThem.Join(all, item => item.Id, element => element.Id, 
  (item, element) => new Person { 
    Id = item.Id ?? element.Id,
    Name = item.Name ?? element.Name,
    Age = item.Age ?? element.Age
  });

您可以在 People 類中實現EqualsGetHashCode並使用Intersect

或者,創建一個 EqualityComparer,這樣您的比較邏輯就會解耦:

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 = all.Intersect(someOfThem, new PeopleIdComparer()).ToList();

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

public class PeopleIdComparer : IEqualityComparer<People>
{
    public bool Equals(People x, People y)
    {
        return x.Id == y.Id;
    }

    public int GetHashCode(People obj)
    {
        return HashCode.Combine(obj.Id);
    }
}

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

    public string Name
    {
        get;
        set;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM