2017-09-17 30 views
0
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))); 

任何关于如何解决这个问题的帮助。

+0

你看过'.Distinct()'命令和'LINQ'吗? – ja72

+0

'RemoveAll'不会修改输入,您必须重新分配carObj的结果。此外,由于每辆车都已经在比较列表中,因此输出将为空。 – orhtej2

+0

独特只会做完全匹配,我需要的是一个子串匹配。 –

回答

0

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

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

如果您想通过StringComparison比较,只是交换ContainsIndexOf(String value, StringComparison comparisonType) > 0

0

您不需要使用两个列表。只是把这个:

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

项目,然后过滤

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