Lambda Expression + IEnumerable + C#+ Where +包含

时间:2011-03-29 15:23:10

标签: c# linq lambda ienumerable where

我认为我的问题很简单, 我是C#的nobe。 我有一个名为IEnumerable<Data>的{​​{1}} items是一个包含3个字符串属性的类。

以下是我想获取attribute1包含字符串

的所有项目的问题
Data

它会引发异常,但是当我使用时:

public IEnumerable<Data> getDataFiltered(IEnumerable<Data> items,string Filter)
{
    return items.Where(item=>item.Attribute1.Contains(Filter));
}

它有效

我错过了什么吗?

5 个答案:

答案 0 :(得分:2)

我假设Attribute1的值为null然后调用.Contains将崩溃而==将不会。

答案 1 :(得分:2)

你的一些Attribute1可能是空的。

您无法在Contains上致电null

答案 2 :(得分:2)

您还应该主动过滤掉Attribute1

的空值结果
return items.Where(i => !String.IsNullOrEmpty(i.Attribute1) && i.Attribute1.Contains(filter));

创建类型的变量时,除非指定值,否则它将具有该类型的默认值。 .NET引用类型和值类型有两种类型。引用类型的默认值(作为类创建的任何内容)为null。字符串是引用类型的示例。

public class Data
{
    public string Attribute1 { get; set; }
    public string Attribute2 { get; set; }
    public string Attribute3 { get; set; }
}

上面的代码,所有三个属性值都没有初始化,其值为NULL。要在使用“new Data()”创建对象的新实例时为三个属性赋值,可以创建一个赋值的构造函数。

public Data()
{
    Attribute1 = Attribute2 = Attribute3 = String.Empty();
}

现在所有属性都将具有空字符串值。意思是它们已初始化但没有值。

值类型(任何定义为结构的东西)不能为NULL。示例包括DateTimeintdoubledecimal等。数字类型的默认值为0. DateTime的默认值为{ {1}}。

答案 3 :(得分:0)

Consdider this:

public IEnumerable<Data> getDataFiltered(IEnumerable<Data> items, string Filter){

    return items.Where(item => item != null && item.Contains(Filter));
}

我添加了无效性检查,以确保在空引用时不调用ContainsString是一种引用类型,这意味着它偶尔可以为null。

答案 4 :(得分:0)

如果要检查确切的值,请使用==如果要检查字符串是否出现,请使用以下任一项。

对于区分大小写的方法如下: -

items.Where(item => (item ?? "").Contains(Filter));

??是c#中的coalesc运算符,就像sql一样,即第一个非值

然而,

包含区分大小写,因此如果不需要,则可能是您想要的以下内容。

items.Where(item => -1 != (item ?? "").IndexOf(Filter, StringComparison .InvariantCultureIgnoreCase));