2013-10-22 86 views
1

具有以下类:展望电子邮件类使用LINQ

[Serializable] 
public class EmailClass 
{ 
    public string from; 
    public List<string> To; 
    public List<string> CC; 
    public string DisplayTo; 
    public string Subject { get; set; } 
    public int attachments;  
    public List<string> attachmentsName; 
    public string DateTimeReceived; 
    public string DateTimeSent; 
    public string FinalFilename; 
    public string DatetimeCreated; 
    public string ExchangeUniqueId; 
    public string ChankeyID; 
    public string FinalFileName {get;set;} 
    public bool Encrypted; 
    public string Descripcion { get; set; } 

} 

一旦对象被反序列化,我寻找到所有的邮件地址的容器。 林创建搜索筛选器正在调查from地址,列表To收集, 和列表CC收集。

所以最后我的LINQ查询是这样的:

listaCorreos.DataSource = 
    listado.Where(
     l => l.from.ToUpper().Contains(textBox1.Text.ToUpper()) || 
     l.To.Any((c) => c.ToUpper().Contains(textBox1.Text.ToUpper()) || 
     l.CC.Any((s) => s.ToUpper().Contains(textBox1.Text.ToUpper()) 
    ))) 
    .ToList(); 

是做任何其他方式?也许另一个表现最好的?什么是 搜索一个字符串变量和几个List变量的最佳方法。

+1

使用含有比较是一个糟糕的主意,认为这两封邮件:'ABC @ mail.com'和'AABC @ mail.com' < - 包含将比较为真 – wudzik

+0

您最好做的第一件事是事先准备* textBox1.Text.ToUpper()*并将其存储在局部变量中。不要忘记每次都会创建一个新的字符串。 – galenus

回答

3

我情愿这样

listado.Where(
       l => 
       l.from.Equals(textbox1.Text, StringComparison.OrdinalIgnoreCase) || 
       l.To.Any((c) => c.Equals(textBox1.Text, StringComparison.OrdinalIgnoreCase) || 
       l.CC.Any((s) => s.Equals(textBox1.Text, StringComparison.OrdinalIgnoreCase) 
      ))).ToList(); 

StringComparison.OrdinalIgnoreCase会忽略的情况下,同时比较,所以你不需要ToUpper的。你有错误使用Contains包含字符串(不list<string>)当你考虑类似的邮件将失败:

[email protected][email protected] - > [email protected]包含[email protected],使用string.Equals何时会返回false通缉。

编辑:

一行代码:

listado.Where(x => 
       new List<string>{ x.from }.Union(x.To) 
         .Union(x.CC) 
         .Any(y => y.Equals(textbox1.Text, 
             StringComparison.OrdinalIgnoreCase))); 
+0

会不会有一班人的工作?因为'from'是一个字符串('IEnumerable '),'To' &&'CC'是'List '。工会如何工作? – SynerCoder

+0

错误CS1929:实例参数:无法从'字符串'转换为'System.Linq.IQueryable ' – SynerCoder

+0

当然不会错过,我想(不知道为什么,那是来自'List ()' )。更正,谢谢 – wudzik