Итерация и выбор двухмерного массива строк с помощью LINQ

1

Я сделал консольное приложение, которое должно перебирать два массива строк и выбирать значения, которые содержатся во вводе пользователя, и показывать эти значения в наборе "строка". К сожалению, я получил ошибку System.Collections.Generic.List '1 [System.String] Вот код приложения:

static void Main(string[] args)
{
    string[,] words = new string[,] 
    { 
        { "5", "" }, 
        { "10", "kare" },  
        { "20", "kanojo" },  
        { "1", "karetachi" },  
        { "7", "korosu" },  
        { "3", "sakura" },  
        { "3", "" }  
    };
    try
    {
        var pre = Console.ReadLine();
        var r = Enumerable
            .Range(0, words.GetLength(0))
            .Where(i => words[i, 1] == pre)
            .Select(i => words[i, 1])
            .OrderBy(i => words[Int32.Parse(i), 0])
            .ToList();
        Console.Write(r);
    }
    catch (Exception ex)
    {
        TextWriter errorWriter = Console.Error;
        errorWriter.WriteLine(ex.Message);
    }
    Console.ReadLine();
}
Теги:
linq
arrays
console-application

3 ответа

1
Лучший ответ

Ваш запрос неверен: вы пытаетесь сопоставить каждое слово из списка со всем входом пользователя, что означает, что вы всегда выбираете одно слово (если в двумерном массиве нет дубликатов). Однако, поскольку вы сортируете результаты, похоже, вы ожидаете, что будет более одного слова.

Чтобы исправить это, замените критерии выбора на использование Contains, например:

var r = Enumerable
    .Range(0, words.GetLength(0))
    .Where(i => pre.Contains(words[i, 1]))
    .Select(i => new {i, w=words[i, 1]})
    .OrderBy(p => Int32.Parse(words[p.i, 0]))
    .Select(p=>p.w)
    .ToList();

Чтобы отобразить результаты в одной строке, вы можете использовать string.Join:

Console.WriteLine("Results: {0}", string.Join(", ", r));

Примечание. Я предполагаю, что упражнение требует использования двумерного массива. Если такого требования нет, вы можете использовать массив кортежей или анонимных типов, позволяя избежать разбора целого числа:

var words = new[] { 
    new { Priority = 5,  Word = "" }
,   new { Priority = 10, Word = "kare" }
,   new { Priority = 20, Word = "kanojo" }
,   ... // and so on
};

Demo.

  • 0
    Ваше решение выглядело правильно, но я получил ошибку "Входная строка была не в правильном формате".
  • 0
    Нет, мне нужно показать список в структуре, аналогичной списку <ul>.
Показать ещё 6 комментариев
1

Это не ошибка, что происходит, когда вы показываете результат вызова функции ToString в List.

(т.е. ваше утверждение работает правильно, вы просто не показываете его так, как думаете... видите?)

Пытаться:

Console.Write(r.Aggregate((a,b) => a + "," + b));

вместо

Console.Write(r);
  • 0
    Не могли бы вы посоветовать, пожалуйста, как мне это исправить, чтобы можно было показать список слов, соответствующих вводу пользователя.
  • 1
    Чтобы проиллюстрировать, что это не ошибка, измените его на Console.Write(r.Count()); или Console.Write(string.Join("\r\n",r.ToArray)
Показать ещё 3 комментария
0
List<List<int>> a2DList = new List<List<int>>()
{
    new List<int>()
    {
        0,1,2,3
    },
    new List<int>()
    {
        4,5,6,7,8
    }
};


Console.WriteLine(string.Join(",",a2DList.SelectMany(s => s).ToArray().Select(s => s)));
  • 2
    Не могли бы вы добавить информацию к вашему ответу? Ответы только для кода не очень полезны. Объясните, что делает код
  • 0
    Надеюсь, что это станет понятнее :) Извините, что не смог получить код для правильного отображения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню