C# 合并两个列表时的逻辑
假设我有两个数据库,心跳。我需要用一些规则把它们合并成一个 如果列表数据库为空,则添加列表检测信号中的所有值,并将Connected value设置为true 如果列表检测信号包含列表数据库中不存在的值,则应将其添加到数据库并将Connected value设置为true 如果列表数据库包含一个值,但列表检测信号没有=在列表数据库中将Connected value设置为false 项目: 第一种情况: 第二种情况 最后一点:C# 合并两个列表时的逻辑,c#,linq,C#,Linq,假设我有两个数据库,心跳。我需要用一些规则把它们合并成一个 如果列表数据库为空,则添加列表检测信号中的所有值,并将Connected value设置为true 如果列表检测信号包含列表数据库中不存在的值,则应将其添加到数据库并将Connected value设置为true 如果列表数据库包含一个值,但列表检测信号没有=在列表数据库中将Connected value设置为false 项目: 第一种情况: 第二种情况 最后一点: List<Item> db = new List<I
List<Item> db = new List<Item>()
{
new Item { Name = "A", Connected = false },
new Item { Name = "B", Connected = false }
};
List<string> heartbeat = new List<string>() { "C", "B", "E" };
你能帮我实现吗?
我尝试过使用Concat、Union等,但没有结果。到目前为止我已经试过了
foreach(var i in heartbeat)
{
var a = db.FirstOrDefault(x => x.Name == i);
if (a == null)
{
db.Add(i);
}
else
{
a.Connected = true;
}
}
foreach(var i in db.Where(x => !heartbeat.Contains(x.Name)))
{
i.Connected = false;
}
如何改进这一点?如果采用正确的方法,这是一个具有线性复杂性的问题
HashSet<string> heartbeat_set = new (heartbeat);
List<Item> newList = new();
foreach (var item in db)
{
var is_heartbeat = heartbeat_set.Remove(item.Name);
newList.Add(new Item {
Name = item.Name, Connected = is_heartbeat && item.Connected
});
}
foreach (var hb in heartbeat_set)
{
newList.Add(new Item {
Name = hb, Connected = true
});
}
通过这种方式,复杂性不超过+M,其中N和M分别是心跳和db的大小
从可枚举项构造HashSet是一个ON操作,而Remove操作是常量。代码很容易理解,唯一需要解释的是Connected=is_heartbeat&&item。Connected:基本上,只有当起始Connected属性为true并且存在对应的heartbeat时,最终Connected属性才为true。幸运的是,如果未找到元素,则返回false,这意味着没有心跳。此查询根据您的要求工作:
List<Item> output =
Enumerable
.Concat(
heartbeat.Select(x => new Item { Name = x, Connected = true }),
db.Select(x => new Item { Name = x.Name, Connected = false }))
.GroupBy(x => x.Name)
.SelectMany(xs => xs.Take(1))
.OrderBy(x => x.Name)
.ToList();
您的第三个输出与您的要求不匹配。在我看来,它应该是假的,然后是三个真的。@Enigmativity你是对的,我错了,谢谢
A, true
B, false
C, true
List<Item> db = new List<Item>()
{
new Item { Name = "A", Connected = false },
new Item { Name = "B", Connected = false }
};
List<string> heartbeat = new List<string>() { "C", "B", "E" };
A, false
B, true
C, true
E, true
foreach(var i in heartbeat)
{
var a = db.FirstOrDefault(x => x.Name == i);
if (a == null)
{
db.Add(i);
}
else
{
a.Connected = true;
}
}
foreach(var i in db.Where(x => !heartbeat.Contains(x.Name)))
{
i.Connected = false;
}
HashSet<string> heartbeat_set = new (heartbeat);
List<Item> newList = new();
foreach (var item in db)
{
var is_heartbeat = heartbeat_set.Remove(item.Name);
newList.Add(new Item {
Name = item.Name, Connected = is_heartbeat && item.Connected
});
}
foreach (var hb in heartbeat_set)
{
newList.Add(new Item {
Name = hb, Connected = true
});
}
List<Item> output =
Enumerable
.Concat(
heartbeat.Select(x => new Item { Name = x, Connected = true }),
db.Select(x => new Item { Name = x.Name, Connected = false }))
.GroupBy(x => x.Name)
.SelectMany(xs => xs.Take(1))
.OrderBy(x => x.Name)
.ToList();