按两个变量对列表进行排序

本文关键字:列表 排序 变量 两个 | 更新日期: 2023-09-27 18:30:25

>得到了一个"客户联系人"---列表,这些具有姓氏(如果是人类)或实体名称(如果是通用联系人,例如 techsupport@mycompany.com)。

我想做的是按姓氏的字母顺序对这个列表进行排序,在没有姓氏存在的情况下(换句话说,实体名称存在),将该实体名称视为姓氏,并继续排序,就好像它是姓氏一样。

因此,所需的结果如下所示:

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

这会导致崩溃,因为它会遇到一些没有姓氏的客户端联系人。

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

以下内容允许我通过而不会崩溃,它按客户联系实体名称的第一个,然后是姓氏对其进行排序:

            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. 威廉姆斯·罗宾

如何使我的列表排序为看起来像上述所需结果?

按两个变量对列表进行排序

尝试使用此比较:

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

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

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

这样做:

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