1

具有以下课程:

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

还有其他方法吗?也许另一个性能最好的?在字符串变量和几个列表变量中搜索的最佳方法是什么。

4

1 回答 1

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在字符串 (not ) 上使用 contains 时出错,将会失败:list<string>

abc@mail.com并且aabc@mail.com-> aabc@mail.com 包含 abc@mail.com,使用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)));
于 2013-10-22T07:03:45.520 回答