2013-10-22 91 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