我最近从JAVA开发环境转移到.net开发环境。我正在使用.net MVC框架开发Web应用程序。有人会帮助我找到以下代码段的含义。它像迭代思想列表一样接缝,但我找不到这个代码示例的具体定义:
SmartTextBoxModel smartTextBoxModel = new SmartTextBoxModel();
List<string> nameList = new List<string>() { "AA", "AB", "AC", "BB", "B" };
var filteredStringList =
from n in nameList
where n.IndexOf(name, 0, StringComparison.OrdinalIgnoreCase) != -1
select n;
SmartTextBoxModel
类有以下代码(它基本上包含列表对象和getter和setter)。
public class SmartTextBoxModel
{
public SmartTextBoxModel()
{
this.NameList = new List<SelectListItem>();
}
public List<SelectListItem> NameList { get;private set; }
public string Name { get; set; }
}
我的问题是这一行是什么意思:
var filteredStringList =
from n in nameList
where n.IndexOf(name, 0, StringComparison.OrdinalIgnoreCase) != -1
select n;
答案 0 :(得分:5)
该行正在选择nameList中的所有实例n,其中字符串n包含字符串名称。因此,您的结果将是nameList中包含字符串名称的任何字符串。
此外,重要的是将其分为两部分。首先,这是一个Linq查询。您可以这样做以查找nameList中与名称完全相同的所有项: var filteredStringList = from nameList中的n,其中n == name select n;
你的where语句“n.IndexOf(name,0,StringComparison.OrdinalIgnoreCase)!= -1”只是改变了更简单的查询,“n == name”以稍微不同的方式进行过滤。首先,n.IndexOf(name)方法获取第一个起始索引,其中字符串名称出现在n中。任何值&gt; = 0表示该名称存在于字符串中。如果字符串不存在,则返回-1。其他参数是索引在哪里开始搜索,在您的情况下为0,字符串比较在您的情况下为StringComparison.OrdinalIgnoreCase。 StringComparison.OrdinalIgnoreCase告诉字符串比较将A和a视为相同,依此类推。
编辑:@Jason还有一个很好的考虑因素。虽然严格来说查询实际上并没有进行迭代,但它实际上是在创建一个linq表达式。只有在调用filteredStringList.ToList()或类似调用之后,表达式才会执行。对于所有意图和目的,结果是相同的,但重要的是知道查询何时将实际执行。有关详情,请参阅此帖子:http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx?wa=wsignin1.0答案 1 :(得分:1)
var filteredStringList =
from n in nameList
where n.IndexOf(name, 0, StringComparison.OrdinalIgnoreCase) != -1
select n;
这是LINQ(特别是query syntax形式),确切地说发生的事情有点复杂和微妙。
粗略的想法是这段代码创建了一个迭代器。迭代此迭代器时,它将仅通过选择满足谓词nameList
的{{1}}元素来过滤nameList
。也就是说,它只会选择包含p(n) = n.IndexOf(name, 0, StringComparison.OrdinalIgnoreCase) != -1
的{{1}}元素(忽略大小写)。
了解nameList
不是列表非常重要(因此,它名称非常可靠)。它不包含过滤结果。它只创建一个对象,捕获用于在迭代时构建过滤后的name
子序列的规则。
答案 2 :(得分:0)
“获取nameList的所有条目,其中包含名称”
答案 3 :(得分:-1)
它说如果nameList中存在名为name的变量,则将其选择为filteredStringList。
答案 4 :(得分:-2)
您的LINQ可以解释为
for (int i = 0; i < nameList.Count; i++)
{
if (nameList[i].IndexOf(name, 0, StringComparison.OrdinalIgnoreCase) != -1)
{
TempList.Add(nameList[i]);
}
}
此处TempList
为List<String> TempList = new List<string>();
在LAMBDA表达式中,您可以将其写为
var filteredStringList = nameList.Where(X => X.IndexOf(name, 0, StringComparison.OrdinalIgnoreCase) != -1);