C# 检查foreachloop中是否存在具有有效条件a的项
我有两个Json文件。一个文件(jOne)指定检查另一个JSON文件(jTwo)中某些内容(某些键和值)的可用性 jOne:-指定需要在第二个JSON文件中查找的所需值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" }, {
[
{
"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是什么?我要检查两个值