根据某些条件删除对象

时间:2020-08-20 03:39:02

标签: c# .net linq

public class Name    {
    public string language { get; set; } 
    public string text { get; set; } 
}

public class ValueItem    {
    public string id { get; set; } 
    public List<Name> names { get; set; } 
    public object syn { get; set; } 
    public List<string> prop { get; set; } 
    public string dataType { get; set; } 
}

public class Source    {
    public string id { get; set; } 
    public string name { get; set; } 
}

public class Result    {
    public List<ValueItem> valueItems { get; set; } 
    public Source source { get; set; } 
}

public class Data    {
    public List<Result> result { get; set; } 
    public int totalpages { get; set; } 
    public int totalrecords { get; set; } 
    public int pagesize { get; set; } 
    public int pagenumber { get; set; } 
}

我具有如上所述的模型结构,我试图基于文本删除 Name 对象。如果我传递的字符串位于Name.text中,则应删除该特定名称对象。如何使用linq或lambda实现此目的。 我已经尝试过:var data1= data.Result.Where(x=>x.ValueItems.Where(a=>a.Names.SelectMany(b=>!str.Contains(b.Text)))).ToList()

1 个答案:

答案 0 :(得分:1)

您可以通过返回原始数据的过滤版本来实现所需的目标:

data.result = data.result.Select(x => new Result
{
    source = x.source,
    valueItems = x.valueItems.Select(a =>
                                         new ValueItem
                                         {
                                             prop = a.prop,
                                             dataType = a.dataType,
                                             id = a.id,
                                             syn = a.syn,
                                             names = a.names
                                                     .Where(i => i.text != stringToRemove)
                                                            .ToList()
                                         }).ToList()

}).ToList();

但是,实现此目标的替代版本(不使用LINQ)可能是:

foreach (var result in data.result)
{
    foreach (var resultValueItem in result.valueItems)
    {
        resultValueItem.names.RemoveAll(i => i.text == stringToRemove);
    }
}

注意:值得一提的是,第二个选项在性能方面更为有效,因为这里没有发生内存分配。


上述解决方案的一些注意事项:

  1. 如果您不希望完全匹配,但是在您的文本可能是较大字符串的一部分的情况下,请使用String.Contains,而不是上面的比较。
  2. 请考虑将String.ToLowerString.ToLowerInvariantString.ToUpperString.ToUperInvariant中的一种方法应用于stringToRemovei.text,以防万一您想要不区分大小写的比较。