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

时间:2010-10-18 04:03:00

标签: c# .net 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;

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;

5 个答案:

答案 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]);
            }

        }

此处TempListList<String> TempList = new List<string>();

在LAMBDA表达式中,您可以将其写为

var filteredStringList = nameList.Where(X => X.IndexOf(name, 0, StringComparison.OrdinalIgnoreCase) != -1);