我有两个可枚举列表: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 |
假设您有如下课程主题:
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将是两者的合并列表。
如果您正在寻找没有 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 中。如果您希望发生相反的情况,只需反转这些值即可。
这个怎么样?
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));
}
不太确定您需要什么。我假设您需要根据 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;
}