Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并两个列表时的逻辑_C#_Linq - Fatal编程技术网

C# 合并两个列表时的逻辑

C# 合并两个列表时的逻辑,c#,linq,C#,Linq,假设我有两个数据库,心跳。我需要用一些规则把它们合并成一个 如果列表数据库为空,则添加列表检测信号中的所有值,并将Connected value设置为true 如果列表检测信号包含列表数据库中不存在的值,则应将其添加到数据库并将Connected value设置为true 如果列表数据库包含一个值,但列表检测信号没有=在列表数据库中将Connected value设置为false 项目: 第一种情况: 第二种情况 最后一点: List<Item> db = new List<I

假设我有两个数据库,心跳。我需要用一些规则把它们合并成一个

如果列表数据库为空,则添加列表检测信号中的所有值,并将Connected value设置为true 如果列表检测信号包含列表数据库中不存在的值,则应将其添加到数据库并将Connected value设置为true 如果列表数据库包含一个值,但列表检测信号没有=在列表数据库中将Connected value设置为false 项目:

第一种情况:

第二种情况

最后一点:

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();