如何使用具有多个条件的 linq 过滤对象列表?

How do I filter a list of objects with linq with multiple criteria?

我正在尝试按多个条件过滤对象列表。首先,如果两个或多个记录的名称和代码相同,我只想 return 一个。但是,如果一个的状态是 "suspended",第二个的状态是 "rented",我只想 return 状态为 "suspended" 的记录。这是我到目前为止得到的:

public class Customer
{
    public string UnitName { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
    public string Phone { get; set; }
    public string Status { get; set; }
}

public static IEnumerable<Customer> FilterDuplicates(IEnumerable<Customer> customers)
{
    return customers
            .GroupBy(c => new {c.Name, c.Code})
            .Select(g => g.First());
}

例如,下面的数据应该return Mister Twister, Frank Furter 和 Jane Jones 状态为 "suspended" 的记录:

{
    "unitName": "A22",
    "code": "00122",
    "status": "rented",
    "phone": "2125551212",
    "name": "Jones, Jane"
},
{
    "unitName": "A07",
    "code": "00122",
    "status": "suspended",
    "phone": "2125551212",
    "name": "Jones, Jane"
},
{
    "unitName": "C19",
    "code": "00222",
    "status": "suspended",
    "phone": "2125557777",
    "name": "Furter, Frank"
},
{
    "unitName": "B14",
    "code": "00333",
    "status": "rented",
    "phone": "2125559999",
    "name": "Twister, Mister"
}

您应该订购每组的内容,然后您可以select您想要哪一个:

return customers
            .GroupBy(c => new {c.Name, c.Code})
            .Select(g => g.OrderByDescending(c => c.status).First());

注意:这本质上是 DistinctBy 的一个特定实现,我以完整的通用形式实现它:

public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> src, Func<T, TKey> keySelector, Func<IGrouping<TKey, T>, T> pickFn, IEqualityComparer<TKey> comparer = null) =>
    src.GroupBy(keySelector, comparer).Select(pickFn);

然后您可以将其用作

return customers.DistinctBy(c => new { c.Name, c.Code }),
                            g => g.OrderByDescending(c => c.status).First());