Как мне найти строку в списке в массиве? - PullRequest
0 голосов
/ 01 марта 2019

Я создал массив со списком типов данных, как показано здесь:

List<string>[] phase2 = new List<string>[200];

С довольно большим количеством инициализаций (вот краткий пример):

    phase2[0] = new List<string>() { "Bob", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes", };
    phase2[1] = new List<string>() { "Jim", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes" };
    phase2[2] = new List<string>() { "Joe", "Complex", "A", "AOT", "zNO", "Yes", "Yes", "Yes" };
    phase2[3] = new List<string>() { "Bill", "Complex", "A", "AOT", "Yes", "Yes", "Yes", "Yes" };
    phase2[4] = new List<string>() { "Robert", "Complex", "A", "PL", "zNO", "Yes", "Yes", "Yes" };

Мне было интереснокак мне искать строку «B» в индексе 3 всех инициализированных мной массивов?

Также в качестве бонуса (не уверен, если это возможно) вы можете искать НЕСКОЛЬКО строк в РАЗЛИЧНЫХиндексы?Например, я хочу вернуть все списки, которые имеют строковое значение «B» в индексе 3 и строковое значение «Да» в индексе 5.

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Спасибо за все ответы!Я еще не узнал о linq, поэтому многие ответы были у меня над головой.Спасибо Lollercoasters за дурацкий раствор:)

Ответы [ 5 ]

0 голосов
/ 01 марта 2019

Вот способ LINQ сделать это:

static void Main(string[] args)
{
    List<string>[] phase2 = Enumerable.Repeat(new List<string>(), 200).ToArray();

    phase2[0] = new List<string>() { "Bob", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes", };
    phase2[1] = new List<string>() { "Jim", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes" };
    phase2[2] = new List<string>() { "Joe", "Complex", "A", "AOT", "zNO", "Yes", "Yes", "Yes" };
    phase2[3] = new List<string>() { "Bill", "Complex", "A", "AOT", "Yes", "Yes", "Yes", "Yes" };
    phase2[4] = new List<string>() { "Robert", "Complex", "A", "PL", "zNO", "Yes", "Yes", "Yes" };

    List<string>[] result = phase2?.Where(x => x.Any(y => y == "B")).ToArray();
}
0 голосов
/ 01 марта 2019

Если вы хотите использовать лямбда-решение, отличное от Linq, которое вы можете лучше понять, вот вам, товарищ:

List<string>[] phase2 = new List<string>[200];
phase2[0] = new List<string>() { "Bob", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes", };
phase2[1] = new List<string>() { "Jim", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes" };
phase2[2] = new List<string>() { "Joe", "Complex", "A", "AOT", "zNO", "Yes", "Yes", "Yes" };
phase2[3] = new List<string>() { "Bill", "Complex", "A", "AOT", "Yes", "Yes", "Yes", "Yes" };
phase2[4] = new List<string>() { "Robert", "Complex", "A", "PL", "zNO", "Yes", "Yes", "Yes" };

for (int i = 0; i < phase2.Length; i++)
{
  var list = phase2[i];
  if (list == null) continue; // skip empty lists
  if (list[2] == "B" && list[4] == "Yes")
  {
    // found elements in list
    Console.WriteLine("found elements in list at index: " + i);
  }
}
0 голосов
/ 01 марта 2019

Вы можете использовать Linq для поиска всех списков, в которых есть элемент, соответствующий вашему аргументу, например:

phase2.Where(list => list.Any(item => item == "string to search for"));
0 голосов
/ 01 марта 2019

Ниже приведен класс, который может вам помочь:

public class ListFilterer
{
    private readonly List<string>[] _searchSpace;

    public ListFilterer(List<string>[] searchSpace)
        => this._searchSpace = searchSpace ?? new List<string>[0];

    public IEnumerable<List<string>> GetListsHaving(params Tuple<int, string>[] query)
        => (from l in _searchSpace
            where AllConditionsMatch(l, query)
            select l);

    private static bool AllConditionsMatch(IReadOnlyList<string> lst, IEnumerable<Tuple<int, string>> conditions)
    {
        foreach (var cond in conditions)
        {
            if (cond.Item1 < 0 || cond.Item1 > lst.Count - 1)
                return false;

            if (lst[cond.Item1] != cond.Item2)
                return false;
        }

        return true;
    }
}
0 голосов
/ 01 марта 2019

Короче говоря, помните, что каждый элемент в phase2 является списком, поэтому он реализует Enumerable, что открывает все возможности LINQ для него.Поиск сразу приходит на ум, с функцией (предикатом), которую вы предоставляете.

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.find?view=netframework-4.7.2

Если вы исследуете этот путь, вы многому научитесь.

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