从数组中获取字符串或在单行中设置默认值
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;
}
所以我们有 ??
来解析当左手为 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;
}