按两个变量对List进行排序

时间:2012-04-06 03:06:36

标签: c# list sorting coding-style

获得了一个“ClientContacts”列表---其中包含一个LastName(在人类的情况下)或一个EntityName(在通用联系人的情况下,例如techsupport@mycompany.com)。 / p>

我想要做的是按LastName按字母顺序排序此列表,如果不存在LastName(换句话说,存在EntityName),则将该EntityName视为LastName,并继续排​​序,就像它是一个姓氏。

这样期望的结果如下所示:

  1. 邦德詹姆斯
  2. 客户支持
  3. 盖茨比尔
  4. 技术支持
  5. 威廉姆斯罗宾

  6. 这会导致崩溃,因为它遇到了一些没有LastName的ClientContacts。

    clientContactList.Sort(
        delegate(ClientContact c1, ClientContact c2) 
            { return c1.LastName.CompareTo(c2.LastName); });
    

    以下内容允许我在没有崩溃的情况下通过,并通过ClientContact EntityName的第一个和那些LastNames对其进行排序:

                list.Sort(delegate(ClientContact c1, ClientContact c2) {
                try
                {
                    return c1.LastName.CompareTo(c2.LastName);
                }
                catch
                {
                    try
                    {
                        return c1.EntityName.CompareTo(c2.LastName);
                    }
                    catch
                    {
                        return c1.EntityName.CompareTo(c2.EntityName);
                    }
    
                }
            });
    

    导致:

    1. 客户支持
    2. 技术支持
    3. 邦德詹姆斯
    4. 盖茨比尔
    5. 威廉姆斯罗宾

    6. 如何将我的列表排序为上面所需的结果?

3 个答案:

答案 0 :(得分:6)

请尝试使用此比较:

(c1.LastName ?? c1.EntityName).CompareTo(c2.LastName ?? c2.EntityName)

答案 1 :(得分:2)

如果你使用LINQ,你可以这样做:

var sortedList = list.OrderBy( x => x.LastName ?? x.EntityName );

答案 2 :(得分:0)

你可以这样做:

list.Sort(delegate(ClientContact c1, ClientContact c2)
{
    return !string.IsNullOrEmpty(c1.LastName) ?
        c1.LastName.CompareTo(c2.LastName) :
        c1.EntityName.CompareTo(c2.LastName);         
});