c# вложенных циклов - получить отдельные элементы из списка (без Linq) - PullRequest
0 голосов
/ 25 апреля 2020

Если у меня есть список, который содержит некоторые возможно дублированные строковые элементы, например, "dog","cat","dog","cow","cow","owl". Мне нужно получить отдельные элементы из этого списка (поэтому мне нужно написать список всех элементов без повторяющихся элементов, т.е. "dog","cat","cow","owl"). Должен быть способ использования его с вложенными циклами, но я застрял на чем-то ниже:

IList<string> animals;
int a = animals.Count();
for (int i=0; i<a; i++)
   {
    foreach (string animal in animals)
    {
     if (animals[i+1] != animals[i])
      {
       Console.WriteLine(animals[i]);
       }
    }
  }

Это что-то близкое, но не правильное. Возможно, вложенное внутреннее l oop должно быть "while" или другое "for". Цени любой совет выше. Спасибо!

Ответы [ 5 ]

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

Используйте HashSet<string> Этот класс похож на список, но не допускает дублирования

IList<string> animals = new List<string> {"Lion", "Wolf", "Tiger", "Dog", "Cat", "Lion", "Tiger"};
HashSet<string> uniques = new HashSet<string>(animals);
foreach(animal in uniques)
   Console.WriteLIne(animal);

Если вы хотите использовать al oop, вы можете упростить свой код используя второй список, в котором вы будете хранить уникальные значения, и в то же время вы можете избежать ложной уникальности, когда единственное различие - это регистр в названии животного сверху или снизу

IList<string> animals = new List<string> {"Lion", "Wolf", "Tiger", "Dog", "Cat", "Lion", "tiger"};
List<string> uniques = new List<string>();
foreach (string animal in animals)
{
    if (!SearchCaseInsensitive(uniques, animal))
        uniques.Add(animal);
}
foreach(string animal in uniques)
    Console.WriteLine(animal);


bool SearchCaseInsensitive(List<string> source, string search)
{
    string lowerCaseSearch = search.ToLower();
    foreach(string animal in source)
        if(animal.ToLower() == lowerCaseSearch)
            return true;
    return false;
}
0 голосов
/ 25 апреля 2020

Еще одно HashSet<string> решение:

HashSet<string> unique = new HashSet<string>();

foreach(var animal in animals)
  if (unique.Add(animal))
    Console.WriteLine(animal);
0 голосов
/ 25 апреля 2020
List<string> animals new List<string> {"dog","cat","dog","cow","cow","owl"};  // your animals list

List<string> sorted = new List<string>();
foreach(string animal in animals)
{
     if (!sorted.Contains(animal))
      {
        sorted.Add(animal);
      }
}
0 голосов
/ 25 апреля 2020

Я рекомендую использовать HashSet.

HashSet<string> uniqueAnimals = new HashSet<string>(animals);
0 голосов
/ 25 апреля 2020

Один из способов добиться этого - использовать al oop для итерации элементов и добавления в другую коллекцию, каждый раз, когда вы встречаете новую. Например,

var unique = new List<string>();
foreach(var animal in animals)
{
    if(!unique.Contains(animal))
    {
        unique.Add(animal);
    }
}

foreach(var item in unique)
{
    Console.WriteLine(item);
}

Если ваша коллекция содержит слишком много элементов, словарь с более быстрым поиском может быть лучшим решением, чем List. Например

var unique = new Dictionary<string,int>();
foreach(var animal in animals)
{
    if(!unique.ContainsKey(animal))
    {
        unique.Add(animal,1);
    }
}

foreach(var item in unique)
{
    Console.WriteLine(item.Key);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...