Добавление в список <string>, но возникают проблемы с добавлением элементов - PullRequest
1 голос
/ 25 февраля 2020

У меня есть 2 списка по 200 наименований в каждом. Список А содержит названия продуктов. Список B содержит цены на товары.

У меня есть еще один список (список C), содержащий 250 наименований, которые включают названия и цены на товары.

Теперь я пытаюсь сравнить имена Списка A, чтобы увидеть, существуют ли они в Списке C, и если они есть, я хочу использовать цену в Списке C.

Это то, что я пробовал до сих пор:

foreach (var item in wiznzList)
{
    for (int j = 0; j < nameList.Count; j++)
    {
        if (nameList[j] == item.ProductName)
        {
            wizNzPriceList.Add(item.Price);
        }
        else
        {
            wizNzPriceList.Add("No Product");
        }
    }
}

Я хочу go просмотреть список имен и проверить, существуют ли они в Списке C, если они есть, я хочу добавить цену из Списка C и, если она не существует, я хочу чтобы написать «Нет продукта».

Итак, в конце я хочу получить 3 списка по 200 элементов в каждом.

Вместо этого, когда я запускаю это, я получаю 10040000 элементов, добавленных в список. Может ли кто-нибудь, пожалуйста, указать мне в правильном направлении.

Ответы [ 4 ]

1 голос
/ 25 февраля 2020

Если я правильно понимаю вашу проблему (и жюри по этому вопросу)

Вы можете использовать ToDictionary и Select

var dict = products.ToDictionary(x => x.ProductName, x => x.Price);
var results = names.Select(x => dict.TryGetValue(x, out var value) ? value.ToString() : "No Product");

Примечание : Вы можете использовать Any для сложности времени O (n ^ 2). Однако ToDictionary будет более эффективным

0 голосов
/ 25 февраля 2020

Мне удалось решить мою проблему с помощью приведенного ниже кода. Большое спасибо, Криспи.

for (int i = 0; i < nameList.Count; i++)
        {
            for (int j = 0; j < wiznzList.Count; j++)
            {
                string a = nameList[i];
                string c = wiznzList[j].ProductName;

                if (string.Equals(a, c))
                {
                    wizNzPriceList.Add(wiznzList[j].Price);
                    break;
                }
                else if (j == (wiznzList.Count - 1))
                {
                    wizNzPriceList.Add("No Product");
                }
            }
        }

Теперь я получаю 200 результатов по мере необходимости. Спасибо всем за ваше время.

0 голосов
/ 25 февраля 2020

Я нашел код, который делает то, что вы от него хотите!

Объект Product (строка pName, float pPrice).

listA Список продуктов, чтобы вы могли хранить и изменять цену .

listB список с плавающей точкой, не используется.

list C список продуктов с pName и pPrice.

Метод CompareA_With_ C () сначала проверяет наличие те же продукты, и если true, поместите цену списка C в listA и вырвитесь из внутреннего l oop.

Оператор else if ожидает, пока l oop не пройдет весь список C и если совпадение pName не найдено, в списке A. изменится pName на «Нет продукта».

Код:

 void CompareA_With_C()
        {
            for (int i = 0; i < listA.Count; i++)
            {
                for (int j = 0; j < listC.Count; j++)
                {
                    string a = listA[i].pName;
                    string c = listC[j].pName;

                    if (string.Equals(a, c))
                    {
                        listA[i].pPrice = listC[j].pPrice;
                        break;
                    }
                    else if (j == (listC.Count - 1))
                    {
                        listA[i].pName = "No Product";
                        listB[i] = 0.0f;
                    }
                }
            }
        }
0 голосов
/ 25 февраля 2020

Вы можете попробовать использовать LINQ и заменить свой внутренний l oop методом Any.

foreach (var item in wiznzList)
{
    if (nameList.Any(p => p == item.ProductName)
    {
        wizNzPriceList.Add(item.Price);
    }
    else
    {
        wizNzPriceList.Add("No Product");
    }
}
...