Почему этот код C# не работает должным образом? - PullRequest
1 голос
/ 30 марта 2020

Это код C# для ввода 10 имен, сортировки их в порядке возрастания и печати с условием, если какой-либо из элементов - «Никто» или «Кто-то», при печати следует пропустить это имя. Проблема с моим кодом состоит в том, что он не пропускает эти 2 упомянутых слова и печатает их, я не понимаю почему.

Пример ввода:
Рави
Кто-то
Танвир
Rame sh
Никто
Ани
Никто
Вишванат
Некто
Нитин

Пример вывода:
Ани
Нитин
Рэйм sh
Рави
Танвир
Вишванат

using System;

using System.Collections;

namespace LearnCsharp
{
    class NamesWithArrayList
    {
        public static void Main(string[] args)
        {
            //Update the code below
            ArrayList alObj;
            alObj = new ArrayList();
            int max=10;
            string item="";
            for(int i=0;i<max;i++)
            {
                alObj.Add(Console.ReadLine());
            }
            alObj.Sort();
            foreach (string item1 in alObj)
            {
                if(alObj.Contains("Somebody")){}
                else if(alObj.Contains("Nobody")){}
                else
                    Console.WriteLine(item1);
            }
        }
    }
}

Ответы [ 4 ]

2 голосов
/ 30 марта 2020
  1. Вы проверяете, содержит ли список каждый раз "Somebody", а не текущее значение равно "Somebody".
  2. ArrayList по сути является набором object s, поэтому при вызове Contains сравнение строк не используется. Вместо этого он использует сравнение ссылок на объекты, и поскольку ваши входные данные являются различными объектами, для которых строковые константы, сравнение всегда завершается неудачей.

Таким образом, версия, которая использует сравнения строк, будет иметь следующий вид:

foreach (string item1 in alObj)
{
    if(item1 == "Somebody"){}
    else if(item1 == "Nobody"){}
    else
        Console.WriteLine(item1);
}

, который можно упростить как:

foreach (string item1 in alObj)
{
    if(item1 != "Somebody" && item1 != "Nobody")
        Console.WriteLine(item1);
}    
1 голос
/ 30 марта 2020

Проблема в том, что в строке if(alObj.Contains("Somebody")){} вы спрашиваете, содержит ли оригинал alObj ArrayList строку "Somebody". Ваш foreach l oop должен быть переписан следующим образом:

foreach (string item1 in alObj)
{
    if(item1 == "Somebody")
    {
    }
    else if (item1 == "Nobody")
    {
    }
    else
        Console.WriteLine(item1);
}

Однако это можно улучшить еще больше, объединив дела «Кто-нибудь» и «Никто» в одно:

foreach (string item1 in alObj)
{
    if(item1 == "Somebody" || item1 == "Nobody")
    {
        // Do nothing
    }
    else
        Console.WriteLine(item1);
}

Наконец, это выглядит немного странно, реальное намерение кода - «Вывести элемент, только если он не равен« Некто »и не равен« Никто », то есть лучше всего выражается так:

foreach (string item1 in alObj)
{
    if(item1 != "Somebody" && item1 != "Nobody")
        Console.WriteLine(item1);
}
1 голос
/ 30 марта 2020

Вам нужно проверить '' 'item1' '', если это искомая строка, и вам нужно добавить код для оператора if, что должно делать ваше приложение.

0 голосов
/ 30 марта 2020

В 2020 году вам не нужно использовать ArrayList. Фактически, единственная причина, по которой это все еще существует, вероятно, заключается в обратной совместимости. Используйте List<string>. Если вы сделаете это, вы можете сделать это

using System.Linq;
myList.Where(x => x != "Nobody" && x != "Somebody")
      .Sort(StringComparer.OrdinalIgnoreCase)
      .ToList()
      .ForEach(x => Console.WriteLine(x));

Другой интересный способ - это

using System.Linq;
var checkList = new List<string>(){ "Nobody", "Somebody" };
myList.Except(checkList)
      .Sort(StringComparer.OrdinalIgnoreCase)
      .ToList()
      .ForEach(x => Console.WriteLine(x));

В этом случае вы работаете на рычаге 2 списков. Вы получите только те элементы, которые не совпадают.

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