如何检查列表中是否存在项目并具有价值

How to check if an item exist in list and has value

我有一个模型 class如下所示

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

下面的json会被反序列化为class 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"
}]}

将值反序列化为 class B 后,我需要验证列表项是否包含 Name Food这些提到的项目的名称、个人名称、武器名称和汽车名称以及 Value 不是 null 或空的。最好的方法是什么?

你可以选择

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

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

如果每个名字只能是一项

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

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

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

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;

看起来你有很多可靠的解决方案。我做了类似于 Sami 的事情。由于您要反序列化为 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");
  }

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