Как получить доступ к определенным данным в результате запроса LINQ? - PullRequest
3 голосов
/ 14 октября 2010

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

string[] str = { "dataReader", "dataTable", "gridView", "textBox", "bool" };

            var s = from n in str
                    where n.StartsWith("data")
                    select n;

            foreach (var x in s)
            {
                Console.WriteLine(x.ToString());
            }
            Console.ReadLine();

Возможно, он напечатает:

dataReader
dataTable

верно?

Что если, например, я не знаю данныхи каковы будут результаты запроса (но я уверен, что он даст некоторые результаты), и я просто хочу напечатать элемент second , который будет создан запросом, каким должен быть мой кодиспользования foreach?

Есть ли здесь что-то вроде индексации массива?

Ответы [ 2 ]

7 голосов
/ 14 октября 2010

Вы ищете Enumerable.ElementAt.

var secondMatch = str.Where(item => item.StartsWith("data")) //consider null-test
                     .ElementAt(1); 

Console.WriteLine(secondMatch); //ToString() is redundant

Поскольку Where передает свои результаты, это будет эффективно - перечисление исходной последовательности будет прекращено после того, каквторое совпадение (интересующее вас) найдено.

Если вы обнаружите, что неявная гарантия того, что источник будет содержать два совпадения, недействительна, вы можете использоватьElementAtOrDefault.

var secondMatch = str.Where(item => item.StartsWith("data"))
                     .ElementAtOrDefault(1); 

if(secondMatch == null) // because default(string) == null
{
   // There are no matches or just a single match..
}
else
{
  // Second match found..
}

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

var secondMatch = str.Where(item => item.StartsWith("data"))
                     .ToArray()[1]; //ElementAt will will work too
6 голосов
/ 14 октября 2010

у вас есть несколько вариантов:

s.Skip(1).First();
s.ElementAt(1);

Первый вариант больше подходит для сценариев, в которых вам нужны элементы X, но после элементов y.Второе более очевидно, когда вам нужен только один элемент в определенном месте

...