这个.net代码行意味着什么

KIt*_*tis 2 .net c# linq

我最近从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;
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是这一行是什么意思:

var filteredStringList = 
  from n in nameList
  where n.IndexOf(name, 0, StringComparison.OrdinalIgnoreCase) != -1
  select n;
Run Code Online (Sandbox Code Playgroud)

Nat*_*ten 5

该行选择nameList中的所有实例n,其中字符串n包含字符串名称.因此,您的结果将是nameList中具有字符串名称的任何字符串.

此外,重要的是将其分解为两部分.首先,这是一个Linq查询.您可以这样做以查找nameList中与名称完全相同的所有项:var filteredStringList = from name in nameList其中n == name select n;

你的where语句"n.IndexOf(name,0,StringComparison.OrdinalIgnoreCase)!= -1"只是改变了更简单的查询,"n == name"以稍微不同的方式进行过滤.首先,n.IndexOf(name)方法获取第一个起始索引,其中字符串名称出现在n中.任何值> = 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 = newsign1.0