我认为我的问题很简单,
我是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));
}
它有效
我错过了什么吗?
答案 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。示例包括DateTime
,int
,double
,decimal
等。数字类型的默认值为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));
}
我添加了无效性检查,以确保在空引用时不调用Contains
。 String
是一种引用类型,这意味着它偶尔可以为null。
答案 4 :(得分:0)
如果要检查确切的值,请使用==如果要检查字符串是否出现,请使用以下任一项。
对于区分大小写的方法如下: -
items.Where(item => (item ?? "").Contains(Filter));
??是c#中的coalesc运算符,就像sql一样,即第一个非值
然而,包含区分大小写,因此如果不需要,则可能是您想要的以下内容。
items.Where(item => -1 != (item ?? "").IndexOf(Filter, StringComparison .InvariantCultureIgnoreCase));