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



我有一个类似的模型类

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食品名称、个人名称、武器名称和汽车名称,以及这些提到的项的值是否为空。最好的方法是什么?

你可以选择类似的东西

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的项目,只要你也有正确名称的项目。

如果每个名称只能有一项

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

但如果允许这几个项目,则需要两个步骤。首先我们将检查值,在此之后命名

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;

看起来您有许多可靠的解决方案。我做了一些类似萨米的事情。由于您正在反序列化为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)));

相关内容

最新更新