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

问题描述 投票:0回答:1

我正在尝试通过多个条件过滤对象列表。首先,如果两个或多个记录的名称和代码相同,我只想返回一个。但是,如果其中一个的状态为“已暂停”,而第二个的状态为“已租用”,则我只想返回状态为“已暂停”的记录。这是到目前为止我得到的:

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

例如,以下数据应返回Twister先生,Frank Furter以及Jane Jones的状态为“暂停”的记录:

{
    "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"
}
linq .net-framework-version
1个回答
1
投票

您应该订购每个组的内容,然后可以选择所需的组:

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());
© www.soinside.com 2019 - 2024. All rights reserved.