如何在LINQ查询结果中访问特定数据?

时间:2010-10-14 13:00:38

标签: c# linq linq-to-objects

我知道,这对你们来说非常简单。 请考虑以下代码:

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

正确?

如果例如我不知道数据,以及查询结果会是什么(但我确定它会返回一些结果),我只想打印第二个查询将生成的项目,我的代码应该是什么,而不是使用foreach

这里有类似数组索引的东西吗?

2 个答案:

答案 0 :(得分:7)

您正在寻找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

答案 1 :(得分:6)

你有几个选择:

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

第一个更适合您想要X元素但在y个第一个元素之后的场景。当您只需要在特定位置使用单个元素时,第二个更清楚