使用源标准实现 LINQ min

时间:2021-01-19 09:08:23

标签: c# linq

如果我想获得一个集合的最小类型,对一个有很多变量和字段的复杂类应用类值的一些标准,这是不能直接完成的。

最接近的尝试是:

public static TSource Min<TSource>(this IEnumerable<TSource> source);

对于一个简单的类来说很清楚:

public static void MaxEx3()
{
    Pet[] pets = { new Pet { Name="Barley", Age=8 },
                   new Pet { Name="Boots", Age=4 },
                   new Pet { Name="Whiskers", Age=1 } };

    Pet max = pets.Max();

    Console.WriteLine(
        "The 'maximum' animal is {0}.",
        max.Name);
}

/*
 This code produces the following output:

 The 'maximum' animal is Barley.
*/

但是对于具有许多字段的类型,没有实现,例如:“返回此特定类型,其中确定的字段的值是最小的”。例如,Vector3 集合中具有最小 z 的集合。

最接近的解决方法是返回您这样的类型的集合(对于 Vector3 类型):

OrderBy( vector => vector.z).Take(1).ToList();

我发现这很奇怪,因为我发现源类型返回具有确定的类字段类型中的条件或任何其他谓词应用逻辑,因此检查类值本身非常方便。对此有什么解释吗?

1 个答案:

答案 0 :(得分:1)

LINQ 中有一个 Enumerable.Min 实现返回 TSource。它要求该类实现 IComparable<T>(在您的情况下为 IComparable<Pet>)或更旧的普通 IComparable。在方法 CompareTo 中,您必须提供可用于确定类的任意两个实例之间关系的代码。这种方法必须提供“稳定”的结果。