2011-03-29 42 views
0

我觉得我的问题很简单, 我是C#中的nobe。 我有一个IEnumerable<Data>名为itemsData是一个包含3个字符串属性的类。Lambda Expression + IEnumerable + C#+ Where + Contains

这是我希望得到的是ATTRIBUTE1包含字符串

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

它抛出一个异常的所有项目的问题,但是当我使用:

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

它的工作原理

难道我想念什么?

+0

你会得到什么异常? – SLaks 2011-03-29 15:26:31

回答

2

你也应该积极地筛选出有ATTRIBUTE1

return items.Where(i => !String.IsNullOrEmpty(i.Attribute1) && i.Attribute1.Contains(filter)); 

空值,结果当你创建一个类型的变量,除非你指定的值,就会产生该类型的默认值。 .NET引用类型和值类型有两种类型。引用类型(作为类创建的任何东西)的默认值为空。字符串是引用类型的示例。

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(); 
} 

现在所有属性都将具有空字符串值。这意味着它们被初始化,但没有价值。

值类型(任何定义为struct的东西)不能为NULL。例如,DateTime,int,double,decimal等。数字类型的默认值为0. DateTime的默认值为DateTime.MinValue

+0

谢谢Nerd:)非常好的解释 – Khaldoun 2011-03-29 15:53:15

2

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

2

您的某些Attribute1可能为空。

您不能致电Containsnull

0

Consdider这样的:

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

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

我加入了无效的检查,以确保Contains不叫上null引用。 String是一个引用类型,它意味着它偶尔可能为空。

+0

集合中的对象不可能是空的(虽然可能),但该属性更可能未被初始化。 – NerdFury 2011-03-29 15:38:40

+0

@NerdFury:你是对的,我想我误解了代码示例 – Dyppl 2011-03-29 17:03:35

0

如果你想检查确切的值使用==,如果你想检查一个字符串的出现使用下列任何一种。

对于区分大小写的方式执行以下操作: -

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

??是c#中的coalesc操作符,就像sql的第一个非值

但是包含区分大小写,所以如果不需要,那么以下可能就是你想要的。

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