Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ筛选不为null的属性并获取其值以运行方法?_C# - Fatal编程技术网

C# 如何使用LINQ筛选不为null的属性并获取其值以运行方法?

C# 如何使用LINQ筛选不为null的属性并获取其值以运行方法?,c#,C#,如何创建LINQ以仅调用一次DoSomething(),以减少这些重复代码?请注意,nameValue中有一些属性,我不需要对此做任何处理DoSomething()仅适用于这4个属性 foreach (var nameValue in nameDetails.NameValue) { if (nameValue.FirstName != null) {

如何创建LINQ以仅调用一次
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并不是魔法,只要在那里就可以让事情变得更好。

简单的解决方案。简单的解决方案。