MST

星途 面试题库

面试题:C#中null条件运算符与空合并运算符在泛型及链式调用场景下的深度理解与应用

编写一个泛型方法,该方法接收一个可能为`null`的泛型集合`List<T>`,其中`T`有一个返回可能为`null`的字符串属性`Value`。在方法内,使用null条件运算符和空合并运算符实现将集合中所有非空的`Value`属性值连接成一个字符串,以逗号分隔。如果集合为`null`或所有`Value`都为`null`,则返回空字符串。
14.8万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试
public static string ConcatenateNonNullValues<T>(List<T> list) where T : class, new()
{
    return list?.Where(item => item.Value != null)
                 .Aggregate("", (current, item) => current + (string.IsNullOrEmpty(current) ? "" : ",") + item.Value)
                 ?? "";
}

上述代码定义了一个泛型方法 ConcatenateNonNullValues,它接收一个 List<T> 类型的参数 list,其中 T 是一个类类型并且有一个无参数构造函数。在方法内部,首先通过 null 条件运算符 ?. 判断 list 是否为 null,如果不为 null,则使用 Where 方法过滤出 Value 属性不为 null 的元素,接着使用 Aggregate 方法将这些元素的 Value 属性值以逗号分隔连接起来。最后通过空合并运算符 ?? 如果 listnull 或者连接结果为空,则返回空字符串。

请注意,在实际使用中,需要确保 T 类型确实具有 Value 属性,上述代码假设 T 类型具有 Value 字符串属性。如果实际情况不同,需要调整代码逻辑。

以下是Java版本代码:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static <T extends HasValue> String concatenateNonNullValues(List<T> list) {
        if (list == null) {
            return "";
        }
        return list.stream()
               .map(T::getValue)
               .filter(str -> str != null)
               .collect(Collectors.joining(","));
    }
}

interface HasValue {
    String getValue();
}

在Java代码中,定义了一个接口 HasValue 要求 T 类型实现 getValue 方法。concatenateNonNullValues 方法先判断 list 是否为 null,如果不为 null,则使用流操作过滤掉 null 值,并以逗号连接。

Python版本代码:

from typing import List, Optional, TypeVar

T = TypeVar('T', bound='HasValue')

class HasValue:
    @property
    def value(self) -> Optional[str]:
        return None

def concatenate_non_null_values(lst: Optional[List[T]]) -> str:
    if not lst:
        return ''
    return ','.join(item.value for item in lst if item.value)

在Python代码中,定义了 HasValue 类,要求泛型类型 T 继承自 HasValue 类且具有 value 属性。concatenate_non_null_values 函数首先检查列表是否为空或 None,如果不为空,则使用生成器表达式过滤出非 nullvalue 值,并使用逗号连接。