Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 检查foreachloop中是否存在具有有效条件a的项_C#_.net_Json_Loops_Serialization - Fatal编程技术网

C# 检查foreachloop中是否存在具有有效条件a的项

C# 检查foreachloop中是否存在具有有效条件a的项,c#,.net,json,loops,serialization,C#,.net,Json,Loops,Serialization,我有两个Json文件。一个文件(jOne)指定检查另一个JSON文件(jTwo)中某些内容(某些键和值)的可用性 jOne:-指定需要在第二个JSON文件中查找的所需值 [ { "IdInOne": "001", "NameInOne": "Name_2" }, { "IdInOne": "002", "NameInOne": "Name_3" } ] jTwo:-应该具有JOne中指定的值的文件 [ { "IdInTwo": "001", "NameInTwo": "Name_1" }, {

我有两个Json文件。一个文件(jOne)指定检查另一个JSON文件(jTwo)中某些内容(某些键和值)的可用性

jOne:-指定需要在第二个JSON文件中查找的所需值

[
{
"IdInOne": "001",
"NameInOne": "Name_2"
},
{
"IdInOne": "002",
"NameInOne": "Name_3"
}
]
jTwo:-应该具有JOne中指定的值的文件

[
{
"IdInTwo": "001",
"NameInTwo": "Name_1"
},
{
"IdInTwo": "001",
"NameInTwo": "Name_2"
},
{
"IdInTwo": "001",
"NameInTwo": "Name_3"
},
{
"IdInTwo": "002",
"NameInTwo": "Name_4"
}
]
因此,我试图做的是检查特定的json键和值对是否确实存在于给定的单独json中,因此在我的第一个json文件中的指定示例中,值IDONE:“001”,NameInOne:“Name_2”,并且我想检查第二个json文件是否实际具有完全匹配的键和值。在第二个JSON中,有多个匹配项,其中IDONE(001)等于IdInTwo,但只有一个值同时具有与指定值匹配的ID和名称

我只是想验证这一点,如果匹配成功,则打印一条消息,如果匹配失败,则打印一个单独的值

这是我尝试过的代码,我发现很难检查值是否确实存在

class Program
{
    static void Main(string[] args)
    {

        string jOne = @"D:\DelTemp\test.json";
        string jTwo = @"D:\DelTemp\test2.json";

        string jOneContent = File.ReadAllText(jOne);
        string jTwoContent = File.ReadAllText(jTwo);

        var InfoInOne = JsonConvert.DeserializeObject<List<One>>(jOneContent);

        var InfoInTwo = JsonConvert.DeserializeObject<List<Two>>(jTwoContent);


        foreach (var itemInOne in InfoInOne)
        {
            foreach (var itemInTwo in InfoInTwo.Where(n => n.IdInTwo == itemInOne.IdInOne && n.NameInTwo==itemInOne.NameInOne))
            {
                if (itemInTwo.exists())
                {
                   //sucess message must be printed
                }
                else
                {
                    Console.WriteLine("Item not found" + itemInTwo.NameInTwo)
                }


            }
        }
    }
}

public class One
{
    public string IdInOne { get; set; }
    public string NameInOne { get; set; }
}

public class Two
{
    public string IdInTwo { get; set; }
    public string NameInTwo { get; set; }
}
类程序
{
静态void Main(字符串[]参数)
{
字符串jOne=@“D:\DelTemp\test.json”;
字符串jTwo=@“D:\DelTemp\test2.json”;
字符串jOneContent=File.ReadAllText(jOne);
字符串jTwoContent=File.ReadAllText(jTwo);
var InfoInOne=JsonConvert.DeserializeObject(jOneContent);
var InfoInTwo=JsonConvert.DeserializeObject(jTwoContent);
foreach(InfoInOne中的var itemInOne)
{
foreach(InfoInTwo.Where(n=>n.IdInTwo==itemInOne.IdInOne&&n.NameInTwo==itemInOne.NameInOne)中的var itemInTwo)
{
if(itemInTwo.exists())
{
//必须打印成功消息
}
其他的
{
Console.WriteLine(“未找到项”+itemInTwo.NameInTwo)
}
}
}
}
}
公共一级
{
公共字符串IDONE{get;set;}
公共字符串NameInOne{get;set;}
}
公共二班
{
公共字符串{get;set;}
公共字符串NameInTwo{get;set;}
}
注意:-我目前实现的一个缺点是性能不好,所以有没有更好的方法来实现这一点。另外,我们只想打印错误消息,说明在完全迭代并确认第二个JSON文件中不存在必需/指定的对象后,找不到该对象

非常感谢您在这方面的帮助


编辑:-当我得到错误时,Interest方法不起作用。
Two'不包含“exists”的定义,并且没有可访问的扩展方法“exists”接受类型为“Two”的第一个参数。
您可以使用
可枚举。除了
。比如说,

var dataNotInInfoTwo = InfoInOne.Select(x=>new {ID=x.IdInOne,Name=x.NameInOne})
               .Except(InfoInTwo.Select(x=>new {ID=x.IdInTwo,Name=x.NameInTwo}));

foreach(var item in dataNotInInfoTwo)
{
        Console.WriteLine($"Data Not Found : ID : {item.ID}, Name:{item.Name}");
}
输出

Data Not Found : ID : 002, Name:Name_3

这是未经测试的情况下,但我想将工作。。。 不确定是否要比较全部或任何,因此以下是两者:

// Will tell you if all the elements in InfoInOne are also found in InfoInTwo
if (InfoInOne.All(x => InfoInTwo.Contains(x)))
{

}
// Will give you a list of all the items found to be in both lists
var matches = InfoInOne.FindAll(x => InfoInTwo.Contains(x));
编辑我错过了您希望单独输出成功和不成功的部分,因此您可以使用以下内容:

foreach (var result in InfoInOne)
{
    if(InfoInTwo.Contains(result)) //sucess message must be printed
    else Console.WriteLine("Item not found" + result.NameInOne) // This in NameInOne, not NameInTwo
}

这里应该不需要区分字段,因为对象只包含基元类型,如果它们完全匹配,则将被视为相等的,或包含在其他列表中。

您是否正在查找
InfoInTwo.Any(n=>n.IdInTwo==itemInOne.idione&&n.NameInTwo==itemInOne.NameInOne)
,它返回一个适用于
if
测试的
bool
。@marcGravel这也是一个很好的解决方案。。你知道如何实施吗?另外,我只想检查一下我所做的是否有其他的实现方法?这是否回答了您的问题?Hi@aloisdgmovingtocodidact.com它没有。我收到错误“它不包含定义…”您可以恢复罢工吗?
exists
应该是
exists()
,并确保您正在使用Linq,并且您已经重建了您的项目。我认为这是检查不存在的内容的一个好方法,但我还想打印一条消息以确认它存在吗?不管怎样,我可以在这里做吗?嗨,谢谢你的回复,但是x是什么?我要检查两个值