如何合并两个 IEnumerable?

问题描述 投票:0回答:4

我有两个可枚举列表:list1 和 list2。

我想从 list2 中获取一些内容并根据条件在 list1 中更新它

例如:list1.Id 表示例如 1、2、3、4、5 等。 list2.Id 有 3, 4

我需要比较这些 Id 并从 list2 中获取与 list1.Id 匹配的其他字段(例如名称、主题)(在本例中为 3 和 4)并将其复制到 list1 其他字段(名称、主题)

列表1:

身份证 姓名 主题
1 N1 S1
2 N2 S2
3
4
5 N5 S5

列表2:

身份证 姓名 主题
3 N3 S3
4 N4 S4

所需结果:

身份证 姓名 主题
1 N1 S1
2 N2 S2
3 N3 S3
4 N4 S4
5 N5 S5
c# asp.net entity-framework generics
4个回答
1
投票

假设您有如下课程主题:

 class Suabject
    {
        public int id;
        public string name;
        public string Subject;
    }

您有如下两个列表:

    List<Suabject> enum1 = new List<Suabject>();
    List<Suabject> enum2 = new List<Suabject>();

如果你想合并它们,你所做的基本上就是遍历 enum2 中的所有项目并检查该项目是否存在于 enum1 中,然后更新它。如果没有,您可以将其添加到列表中。如下:

  foreach (var item in enum2)
            {
                var s = enum1.FirstOrDefault(x=> x.id == item.id);
                if(s != null)
                {
                    s.name = item.name;
                    s.Subject = item.Subject;
                }
                else
                    enum1.Add(s);
            }

这样,enum1将是两者的合并列表。


1
投票

如果您正在寻找没有 Foreach 的解决方案,您是否考虑过在这部分使用字典,将键设置为对象的 id,将值设置为对象本身。

Dictionary<int, ObjectType> dictA = new Dictionary<int, ObjectType>();

在其中添加如下值:

dictA.Add(object.Id, object);

然后你将能够在没有 Foreach 的情况下进行合并,如下所示:

dictA = dictA.Concat(dictB.Where(b => !dictA.ContainsKey(b.Key))).ToDictionary(b => b.Key, b => b.Value);

这样,dictB 就会合并到 dictA 中。如果您希望发生相反的情况,只需反转这些值即可。


0
投票

这个怎么样?

var listOne = new[]
{
    new Entity { Id = 1, Name = "N1", Subject = "S1" },
    new Entity { Id = 2, Name = "N2", Subject = "S2" },
    new Entity { Id = 3 },
    new Entity { Id = 4 },
    new Entity { Id = 5, Name = "N5", Subject = "S5" },
};

var listTwo = new[]
{
    new Entity { Id = 3, Name = "N3", Subject = "S3" },
    new Entity { Id = 4, Name = "N4", Subject = "S4" },
};

// Join to lists by using 1:1 relationship
var pairs = listOne.Join(listTwo, entity => entity.Id, entity => entity.Id, (one, two) => (one, two));

foreach (var pair in pairs)
{
    // Update first name, if empty
    if(string.IsNullOrEmpty(pair.one.Name))
        pair.one.Name = pair.two.Name;

    // Update first subject, if empty
    if(string.IsNullOrEmpty(pair.one.Subject))
        pair.one.Subject = pair.two.Subject;
}

// Save and show elements
foreach (var item in listOne)
{
    Console.WriteLine(JsonConvert.SerializeObject(item));
}

-1
投票

不太确定您需要什么。我假设您需要根据 enum2 更新 enum1 中的数据,在这种情况下请执行以下操作:

foreach(var item in enum2)
{
    var itemToUpdate = enum1.SingleOrDefault(x => x.Id == item.Id);
    if (itemToUpdate == null) continue;
    itemToUpdate.Name = item.Name;
    itemToUpdate.Subject = item.Subject;
}
© www.soinside.com 2019 - 2024. All rights reserved.