如何检查列表中是否存在项目并具有价值
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;
}
}
这可能是一个丑陋的解决方案,但它应该有效。另请注意,这不会检查列表中的任何其他项目。你可以有一个 Name
是 George
并且 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)));
我有一个模型 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;
}
}
这可能是一个丑陋的解决方案,但它应该有效。另请注意,这不会检查列表中的任何其他项目。你可以有一个 Name
是 George
并且 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)));