从数组中获取字符串或在单行中设置默认值

Get string from array or set default value in a one liner

所以我们有 ?? 来解析当左手为 null 时的右手值。 string[].

的等价物是什么

例如

string value = "One - Two"
string firstValue = value.Split('-')[0] ?? string.Empty;
string secondValue = value.Split('-')[1] ?? string.Empty;

如果我们尝试获取第三个索引或string value = "One",上述示例仍会崩溃。因为它不是 null 但 IndexOutOfRangeException 被抛出。

https://docs.microsoft.com/en-us/dotnet/api/system.indexoutofrangeexception

那么解决上述问题的单线方案是什么?我想避免 try-catch 场景,因为这会产生丑陋的代码。

我想从 string[] 中获取价值,并将 string.Empty 作为备用值,这样我的 string 永远不会 null

嗯,你可以试试Linq:

using System.Linq;

...

string thirdValue = value.Split('-').ElementAtOrDefault(2) ?? string.Empty;

但是,您的代码有一个 缺点:您经常 Split 相同的字符串 。我建议提取 value.Split('-'):

string value = "One - Two"
var items = value.Split('-');

string firstValue = items.ElementAtOrDefault(0) ?? string.Empty;
string secondValue = items.ElementAtOrDefault(1) ?? string.Empty;

我建议您为此创建一个方法。它将接受两个字符串类型的输入(代表输入字符串)和一个整数(代表指定的索引),如果指定的索引可用,则应该 return 拆分值,否则它将 return 一个空字符串:

string GetSubstring(string input, int index)
{
    string returnValue = String.Empty;
    string[] substrings = input.Split(new[] { "-" }, StringSplitOptions.RemoveEmptyEntries);
    returnValue = substrings.Length > index ? substrings[index] : returnValue;
    return returnValue;
}

这里有一个working example供大家参考

也许下面的代码会有用

string value = "One - Two";
string firstValue = (value.Split('-').Length == 1 ? value.Split('-')[0] : null) ?? string.Empty;
string secondValue = (value.Split('-').Length == 2 ? value.Split('-')[1] : null) ?? string.Empty;

实现此目的的一种方法是使用 MoreLinq's Lead 和元组解构:

string value = "One - Two";
var (first, second) = value.Split('-').Lead(1, string.Empty, (x, y) => (x, y)).First();

或者,如果您想要一种适用于所有索引的更通用的方法:

string value = "One - Two - Three - Fourth - Fifth";
var (first, second) = value.Split('-').Skip(6).Concat(string.Empty).Lead(7, string.Empty, (x, y) => (x, y)).First();

此代码将获得第七和第十四条目(两者都不存在,因此 string.Empty 将用于两者)。

另一个要考虑的选项是在同一行代码上分配两个不同的变量

string value = "One - Two";
var split = value.Split('-');
string first = split[0] ?? string.Empty, second = split.ElementAtOrDefault(1) ?? string.Empty;

这为您提供了三行代码、良好的性能以及合理的清晰度和可读性。

请注意,无需使用 ElementOrDefault(0) - 最好使用 [0],因为 Split 永远不会 return 一个没有元素的数组。

另一种选择是使用 - 但只有当您对数组开头的连续条目感兴趣时才真正有用(尽管可以对其进行调整以合理简单地采用索引参数):

public static void Destructure<T>(this T[] items, T defaultValue, out T t0, out T t1)
{
    t0 = items.Length > 0 ? items[0] : defaultValue;
    t1 = items.Length > 1 ? items[1] : defaultValue;
}