根据条件过滤对象列表

时间:2017-09-17 13:59:37

标签: c# string linq lambda

public Class Car 
{
    public string Name {get;set;}
    public string Color {get;set;}
}

Car1 = new {"Ford", "White"}
Car2 = new {"Ford Fiesta", "Blue"}
Car3 = new {"Honda City", "Yellow"}
Car4 = new {"Honda", "White"}

var carObj = new List<Car>();

carObj.Add(Car1);
carObj.Add(Car2);
carObj.Add(Car3);
carObj.Add(Car4);

我需要根据汽车名称过滤输出,这样如果名称是任何名称的子集,它将删除它们。

输出:

Car2 = new {"Ford Fiesta", "Blue"}
Car3 = new {"Honda City", "Yellow"}

以下是我要写的内容,但它没有给我所需的输出。

// Remove duplicare records.
var carObjNEW = new List<Car>();
carObjNEW = carObj;

carObj.RemoveAll(a => carObjNEW.Any(b => a.Name.Contains(b.Name)));

有关如何解决此问题的任何帮助。

3 个答案:

答案 0 :(得分:0)

您无需使用两个列表。就这样说:

carObj.RemoveAll(a => 
    carObj.Any(b => b.Name.Contains(a.Name) && b.Name.Length > a.Name.Length));

答案 1 :(得分:0)

正如我在评论中指出的那样,你有一个简单的错误。如果list包含另一个包含第一个项目的项目作为子字符串,则需要删除项目:

carObj.RemoveAll(a => carObj.Any(b => b.Name.ToLower().Contains(a.Name.ToLower()) && b.Name.Length > a.Name.Length));

如果您想按StringComparison进行比较,只需将Contains交换为IndexOf(String value, StringComparison comparisonType) > 0

答案 2 :(得分:0)

投影然后过滤

carObj.Select(c => new { c, Match = carObj.Any(cc => cc.Name != c.Name && cc.Name.Contains(c.Name))}).Where(n => !n.Match)