gpt4 book ai didi

c# - 使用偶尔为空属性的 LINQ SequenceEqual 扩展方法

转载 作者:行者123 更新时间:2023-11-30 13:37:32 31 4
gpt4 key购买 nike

我正在编写一个简单的控制台应用程序来比较自定义类对象的两个实例。对于每个属性,我将 True 或 False 写入控制台窗口以显示每个对象的属性是否匹配。

某些属性,如 ProductLines(列表属性),在一个或两个对象中可能为空...或两者都不是。这给使用 SequenceEqual 带来了一个小问题,因为它不接受空值。 有没有比我写的代码更好的比较两个序列属性的方法?

// test if either collection property is null.
if (commsA.Last().ProductLines == null || commsB.Last().ProductLines == null)
{
// if both null, return true.
if (commsA.Last().ProductLines == null && commsB.Last().ProductLines == null)
{
Console.WriteLine("Property Match:{0}", true);
}
// else return false.
else
{
Console.WriteLine("Property Match:{0}", false);
}
}
// neither property is null. compare values and return boolean.
else
{
Console.WriteLine("Property Match:{0}",
commsA.Last().ProductLines.SequenceEqual(commsB.Last().ProductLines));
}

最佳答案

我可能会添加一个 NullRespectingSequenceEqual 扩展方法:

public static class MoreEnumerable
{
public static bool NullRespectingSequenceEqual<T>(
this IEnumerable<T> first, IEnumerable<T> second)
{
if (first == null && second == null)
{
return true;
}
if (first == null || second == null)
{
return false;
}
return first.SequenceEqual(second);
}
}

或者使用堆叠条件运算符:

public static class MoreEnumerable
{
public static bool NullRespectingSequenceEqual<T>(
this IEnumerable<T> first, IEnumerable<T> second)
{
return first == null && second == null ? true
: first == null || second == null ? false
: first.SequenceEqual(second);
}
}

然后你就可以使用:

Console.WriteLine("Property Match: {0}",
x.ProductLines.NullRespectingSequenceEqual(y.ProductLines));

(关于您是否应该调用 Last 的问题略有不同。)

您可以在任何需要的地方重用该扩展方法,就像它是 LINQ to Objects 的正常部分一样。 (当然,它不适用于 LINQ to SQL 等。)

关于c# - 使用偶尔为空属性的 LINQ SequenceEqual 扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22165088/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com