проверка, действительно ли существует элемент с действительными условиями в foreachloop - PullRequest
0 голосов
/ 21 января 2020

У меня есть два 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" и я хочу проверить, действительно ли у 2-го JSON файла есть ключ и значение, которое ТОЧНО совпадает. Во втором JSON есть несколько совпадений, в которых IdInOne (001) равен IdInTwo, но только одно значение имеет идентификатор и имя, совпадающие с указанным.

Я просто хочу проверить это и распечатать сообщение, если совпадение успешно, и вывести отдельное значение, если совпадение неуспешно

Вот код, который я пробовал, и я нахожу его трудно проверить, существует ли значение на самом деле

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'

Ответы [ 3 ]

0 голосов
/ 21 января 2020

Вы можете оставить присоединиться к двум коллекциям. Объединение использует ha sh таблицы для быстрого поиска.

var InfoInOne = new List<One>() { new One { IdInOne = "A", NameInOne = "A" }, new One { IdInOne = "B", NameInOne = "B" }  };
var InfoInTwo = new List<Two>() { new Two { IdInTwo = "A", NameInTwo = "A" }, new Two { IdInTwo = "C", NameInTwo = "C" }  };

var q = from one in InfoInOne
        join two in InfoInTwo on new { Id = one.IdInOne, Name = one.NameInOne } equals 
                                 new { Id = two.IdInTwo, Name = two.NameInTwo } into g
        from two in g.DefaultIfEmpty()
        select new {One = one, Two = two};

foreach (var item in q)
{
    if(item.Two != null)
        Console.WriteLine("Item found");
    else
        Console.WriteLine("Item not found");
}
0 голосов
/ 21 января 2020

Это не проверено для ваших обстоятельств, но я думаю, что это сработает ... Не уверен, если вы хотите сравнить все или любые, так вот оба:

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

Не нужно выделять поля здесь, поскольку объекты содержат только примитивные типы и будут считаться равными, или в другом списке, если они точно совпадают.

0 голосов
/ 21 января 2020

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...