【问题标题】:How to check if an item exist in list and has value如何检查一个项目是否存在于列表中并具有价值
【发布时间】:2022-01-06 18:16:39
【问题描述】:

我有一个像下面这样的模型类

public class A
{
 public string Name{get;set;}
 public string Value{get;set;}
}
public class B
{
 public List<A>Items{get;set;}
}

下面的json会被反序列化为B类

{
"Items":[
{
  "Name":"Food Name"
  "Value":"Fries"
},
{
  "Name":"Weapon Name"
  "Value":"Gun"
},
{
  "Name":"Vehicle Name"
  "Value":"Car"
},
{
  "Name":"Pet Name"
  "Value":"Mewto"
},
{
  "Name":"Personal Name"
  "Value":"Leo"
}]}

一旦值被反序列化为 B 类,我需要验证列表项是否包含 Name 食物名称、个人名称、武器名称和汽车名称以及 Value 不为 null 或为空。最好的方法是什么?

【问题讨论】:

  • @Austin 说得对

标签: c# .net .net-core asp.net-core-webapi asp.net-core-3.1


【解决方案1】:

你可以选择类似的东西

List<A> Items = //however you get the list
string[] names = {"Food Name","Personal Name","Weapon Name", "Car Name"};
foreach (string s in names)
{
    var item = Items.FirstOrDefault(i => i.Name == s);
    if (item == null || String.IsNullOrWhiteSpace(item.Value))
    {
        // handle the missing data
        break;
    }
}

这可能是一个丑陋的解决方案,但它应该可以工作。另请注意,这不会检查列表中的任何其他项目。你可以有一个项目,其中NameGeorgeValue 可能是Potato,只要你也有正确名称的项目。

【讨论】:

  • OP 想知道项目列表是否有效,而不是处理丢失的数据。
  • 是的,处理丢失的数据可以是例如通知用户无效列表、向网络服务器发送错误报告或关闭核反应堆。我无法根据问题推断出正确的程序,所以我只是添加了一个占位符来“处理”它。
  • 这是有道理的,但基于我认为他只想获得一个布尔值来指示整个列表是否有效的问题。无论哪种方式,我指出的都是一件非常小的事情。
【解决方案2】:

如果每个名字只能是一项

var jsonParsed=JsonConvert.DeserializeObject<B>(json);

var valid=  jsonParsed.Items.Count(i=> names.Contains(i.Name) 
                && !string.IsNullOrEmpty(i.Value))==names.Length;

但如果允许多个项目,则需要 2 个步骤。首先,我们将检查值,在此之后 - 名称

var valid=false;
 
var notValidValues =jsonParsed.Items.Any(i=> names.Contains(i.Name) 
                          && string.IsNullOrEmpty(i.Value));
    
if (!notValidValues) valid = jsonParsed.Items.Where(i => names.Contains(i.Name))
                                    .GroupBy(i => i.Name).Count() == names.Length;

【讨论】:

  • 似乎比我的解决方案更干净。一个问题,主要是让我学习,因为这是比较列表中的计数,如果jsonParsed 将有两个项目,其中Name 是“食物名称”而没有“个人名称”,这会捕获错误吗?
  • @Sami 好问题。我也在考虑这个问题。但我不知道所有细节。但也可以代替“武器名称”,例如“武器名称”。这将是同一种错误。
  • 是的,所以无论如何都应该进行一些验证..
  • @Sami 对不起,我现在才明白你的意思。例如,我不知道它是否可以是几种武器。但以防万一我更新了我的解决方案。
  • 可以在一个步骤中检查值和名称。检查我的答案。
【解决方案3】:

看起来你有很多可靠的解决方案。我做了类似萨米的事情。由于您要反序列化为 B,因此我创建了 List 来表示它。不是最优雅的,但它有效。希望你能找到适合你的方法

//Sample list
var newB = new B
{
    Items = new List<A>
    {
        new A{Name = "Food Name", Value = "Fries" },
        new A{Name = "Weapon Name", Value = "Gun" },
        new A{ Name = "Weapon Name", Value = "" },
    }
};


foreach (var item in newB.Items)
{
   string[] vals = { item.Name, item.Value };   

   if (String.IsNullOrEmpty(vals[0]) || String.IsNullOrEmpty(vals[1]))
  {
    //Handle missing vals
    Console.WriteLine("We have a missing val");
  }
  else
  {
     Console.WriteLine("Good to go");
  }

}

【讨论】:

    【解决方案4】:
    string[] mandatoryNames = { "Food Name", "Personal Name", "Weapon Name", "Car Name" };
    var valid = mandatoryNames
        .All(mandatoryName => items
            .Any(item => item.Name == mandatoryName
                         && !string.IsNullOrEmpty(item.Value)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 2019-07-26
      • 1970-01-01
      • 2019-12-18
      • 2019-06-22
      相关资源
      最近更新 更多