yon*_*236 3 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();
Run Code Online (Sandbox Code Playgroud)
据说,它将打印:
dataReader
dataTable
Run Code Online (Sandbox Code Playgroud)
对?
例如,如果我不知道数据,以及查询的结果是什么(但我确定它会返回一些结果),我只想打印查询将生成的第二个项目,我的代码应该是什么而不是使用foreach?
这里有像数组索引这样的东西吗?
var secondMatch = str.Where(item => item.StartsWith("data")) //consider null-test
.ElementAt(1);
Console.WriteLine(secondMatch); //ToString() is redundant
Run Code Online (Sandbox Code Playgroud)
由于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..
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里使用数组索引,但只有在将结果加载到...数组后才能使用.这当然意味着必须枚举整个源序列并将匹配加载到数组中,所以如果您只对第二场比赛感兴趣,那就有点浪费了.
var secondMatch = str.Where(item => item.StartsWith("data"))
.ToArray()[1]; //ElementAt will will work too
Run Code Online (Sandbox Code Playgroud)
你有几个选择:
s.Skip(1).First();
s.ElementAt(1);
Run Code Online (Sandbox Code Playgroud)
第一个更适合您想要X元素但在y个第一个元素之后的场景.当您在特定位置需要单个元素时,第二个更清楚
| 归档时间: |
|
| 查看次数: |
1755 次 |
| 最近记录: |