【问题标题】:checking if an item with a valid conditiona actually exist in an foreachloop检查具有有效条件的项目是否确实存在于 foreach 循环中
【发布时间】:2020-01-21 13:32:49
【问题描述】:

我有两个 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 文件中的指定示例中,值 IdInOne": "001",NameInOne" : "Name_2" 我想检查第二个 JSON 文件是否真的有一个完全匹配的键和值。在第二个 JSON 中有多个匹配项,其中 IdInOne (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; }
}

注意:- 我当前实现的一个缺点是性能不佳,我相信有没有更好的方法来实现它。也只想打印错误消息,说明在完全迭代并确认它不在第二个 JSON 文件中之后找不到所需/指定的对象

非常感谢您对此的任何帮助

编辑:- Interesct 方法不起作用,因为我收到错误 Two' does not contain a definition for 'exists' and no accessible extension method 'exists' accepting a first argument of type 'Two'

【问题讨论】:

  • 您在寻找InfoInTwo.Any(n =&gt; n.IdInTwo == itemInOne.IdInOne &amp;&amp; n.NameInTwo==itemInOne.NameInOne),它返回适合if 测试的bool
  • @MarcGravell 这也是一个很好的解决方案..知道如何实现它吗?也只是想检查我所做的是否有任何替代实现?
  • 嗨@aloisdgmovingtocodidact.com 它没有。我收到错误“它不包含定义....”你能恢复罢工吗?
  • exists 应该是 Exists() 并确保您使用的是 Linq 并且您已经重建了您的项目。

标签: c# .net json loops serialization


【解决方案1】:

您可以使用Enumerable.Except。例如,

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

【讨论】:

  • 我认为这是检查什么不存在的好方法,但我也想打印一条消息以确认它存在?反正我可以在这里做吗?
【解决方案2】:

这是未经测试的你的情况,但我想会工作...... 不确定您是要比较全部还是任意,所以这里是两者:

// 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
}

这里应该不需要分开字段,因为对象只包含原始类型,如果它们完全匹配,将被视为相等或包含在另一个列表中。

【讨论】:

  • 您好,谢谢您的回复,但是 x 是什么?我要检查两个值
猜你喜欢
  • 2014-11-12
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多