C# 如何使用LINQ筛选不为null的属性并获取其值以运行方法?
如何创建LINQ以仅调用一次C# 如何使用LINQ筛选不为null的属性并获取其值以运行方法?,c#,C#,如何创建LINQ以仅调用一次DoSomething(),以减少这些重复代码?请注意,nameValue中有一些属性,我不需要对此做任何处理DoSomething()仅适用于这4个属性 foreach (var nameValue in nameDetails.NameValue) { if (nameValue.FirstName != null) {
DoSomething()
,以减少这些重复代码?请注意,nameValue
中有一些属性,我不需要对此做任何处理DoSomething()
仅适用于这4个属性
foreach (var nameValue in nameDetails.NameValue)
{
if (nameValue.FirstName != null)
{
DoSomething(nameValue.FirstName)
}
if (nameValue.MaidenName != null)
{
DoSomething(nameValue.MaidenName)
}
if (nameValue.MiddleName != null)
{
DoSomething(nameValue.MiddleName)
}
if (nameValue.Surname != null)
{
DoSomething(nameValue.Surname)
}
}
您可以创建*名称的数组,然后使用将二维数组展平为
IEnumerable
,例如:
var enumerable = nameDetails.NameValue.SelectMany(elem => new[]
{
elem.FirstName,
elem.MaidenName,
elem.MiddleName,
elem.Surname
}).Where(value => value != null);
foreach (var value in enumerable)
{
DoSomething(value);
}
您可以创建*名称的数组,然后使用将二维数组展平为
IEnumerable
,例如:
var enumerable = nameDetails.NameValue.SelectMany(elem => new[]
{
elem.FirstName,
elem.MaidenName,
elem.MiddleName,
elem.Surname
}).Where(value => value != null);
foreach (var value in enumerable)
{
DoSomething(value);
}
我对你的问题的解释是,你只想写一次
DoSomething
,但如果不止一个名称部分不为空,你还想执行多次
您可以将代码重构为:
var names=nameDetails.NameValue
.SelectMany(nv=>新字符串[]{nv.FirstName,nv.MaidenName,nv.MiddleName,nv.name})
.Where(name=>name!=null);
foreach(名称中的变量名称)
{
DoSomething(名称);
}
这使得使用它可以将源可枚举项的每一项映射为多个值,然后将这些值展平为映射元素值类型的可枚举项。我对您的问题的解释是,您只想编写一次
DoSomething
,但如果有多个值,仍然希望执行多次名称部分不为空
您可以将代码重构为:
var names=nameDetails.NameValue
.SelectMany(nv=>新字符串[]{nv.FirstName,nv.MaidenName,nv.MiddleName,nv.name})
.Where(name=>name!=null);
foreach(名称中的变量名称)
{
DoSomething(名称);
}
这使得使用它可以将源可枚举项的每个项映射为多个值,然后将这些值展平为映射元素值类型的可枚举项。将条件移动到函数中,您可以写入
foreach (var nameValue in nameDetails.NameValue)
{
DoSomethingMaybe(nameValue.FirstName);
DoSomethingMaybe(nameValue.MaidenName);
DoSomethingMaybe(nameValue.MiddleName);
DoSomethingMaybe(nameValue.Surname);
}
void DoSomethingMaybe(string value)
{
if (value != null)
{
DoSomething(value)
}
}
完全可读,没有不必要的开销,没有一次性对象。也许不是你所期望的答案,但LINQ并不是魔法,只要存在就可以让事情变得更好。将条件移动到函数中,你就可以编写
foreach (var nameValue in nameDetails.NameValue)
{
DoSomethingMaybe(nameValue.FirstName);
DoSomethingMaybe(nameValue.MaidenName);
DoSomethingMaybe(nameValue.MiddleName);
DoSomethingMaybe(nameValue.Surname);
}
void DoSomethingMaybe(string value)
{
if (value != null)
{
DoSomething(value)
}
}
完全可读,没有不必要的开销,没有一次性对象。也许不是你所期望的答案,但LINQ并不是魔法,只要在那里就可以让事情变得更好。简单的解决方案。简单的解决方案。