【发布时间】:2017-11-02 14:37:39
【问题描述】:
给定:
class Program
{
private static readonly List<(int a, int b, int c)> Map = new List<(int a, int b, int c)>()
{
(1, 1, 2),
(1, 2, 3),
(2, 2, 4)
};
static void Main(string[] args)
{
var result = Map.FirstOrDefault(w => w.a == 4 && w.b == 4);
if (result == null)
Console.WriteLine("Not found");
else
Console.WriteLine("Found");
}
}
在上面的示例中,在if (result == null) 行遇到了编译器错误。
CS0019 运算符“==”不能应用于“(int a, int b, int c)”和“
”类型的操作数
在继续我的“找到”逻辑之前,我将如何检查是否找到了元组?
在使用新的 c# 7 元组之前,我会这样:
class Program
{
private static readonly List<Tuple<int, int, int>> Map = new List<Tuple<int, int, int>>()
{
new Tuple<int, int, int> (1, 1, 2),
new Tuple<int, int, int> (1, 2, 3),
new Tuple<int, int, int> (2, 2, 4)
};
static void Main(string[] args)
{
var result = Map.FirstOrDefault(w => w.Item1 == 4 && w.Item2 == 4);
if (result == null)
Console.WriteLine("Not found");
else
Console.WriteLine("Found");
}
}
效果很好。我喜欢新语法更容易解释的意图,但不确定如何在对找到的内容采取行动(或不采取行动)之前对其进行空检查。
【问题讨论】:
-
值元组是值类型。它们不能为空
-
在这种情况下,默认值为 3 个零的元组,而不是
null。所以你可以检查一下。 -
@juharr 但如果列表包含 (0,0,0) 项,这将中断,因此不太可靠。
-
@Evk (0,0,0) 在这种情况下与谓词不匹配,但在其他情况下可能是个问题。
-
@PanagiotisKanavos 不正确。如果集合包含 (0,0,0) 并且谓词匹配它怎么办?然后您必须使用
Any进行预先检查,或者使用Take(1).ToArray()进行xanatos 的技巧来区分未找到和找到,但恰好与默认值匹配。