gpt4 book ai didi

c# - 函数的通用约束

转载 作者:太空狗 更新时间:2023-10-29 17:34:37 24 4
gpt4 key购买 nike

我想编写一个对类型有约束的通用函数。具体来说,我想要这样的东西:

bool IsInList<T>(T value, params T[] args)
{
bool found = false;
foreach(var arg in args)
{
if(arg == value)
{
found = true;
break;
}
}
return found;
}

重点是您可以检查某个项目是否在参数列表中,即:

if(IsInList("Eggs", "Cheese", "Eggs", "Ham"))

但是,编译器在相等行上发出声音。所以我想限制它实现 IEquatable 的类型。但是,约束似乎只在类级别起作用。这是正确的,还是有某种方法可以通用地指定它?

最佳答案

其他人提到了IEquatable<T>这当然是一个很好的潜在约束。

另一个要记住的选项是 EqualityComparer<T>.Default ,这将使用 IEquatable<T>如果可用,但回退到 object.Equals(object)否则。这意味着您可以将它与早于泛型但覆盖 Equals 的类型一起使用,例如:

bool IsInList<T>(T value, params T[] args)
{
IEqualityComparer<T> comparer = EqualityComparer<T>.Default;
bool found = false;
foreach(var arg in args)
{
if(comparer.Equals(arg, value))
{
found = true;
break;
}
}
return found;
}

请注意,默认的相等比较器还处理空引用,因此您无需自己担心这些。如果输入 T没有覆盖 object.Equals(object)或实现IEquatable<T> ,您将获得引用相等语义(即,如果确切的引用在数组中,它只会返回 true)。

其他几点:

  • IMO,您希望坚持使用单个退出点会降低代码的可读性。这里不需要额外的变量:

    bool IsInList<T>(T value, params T[] args)
    {
    IEqualityComparer<T> comparer = EqualityComparer<T>.Default;
    foreach (var arg in args)
    {
    if (comparer.Equals(arg, value))
    {
    return true;
    }
    }
    return false;
    }
  • LINQ 已经包含一个方法,Contains ,因此您可以将代码简化为:

    bool IsInList<T>(T value, params T[] args)
    {
    return args.Contains(value);
    }
  • Array使用 IndexOf 也有效地包含此功能:

    bool IsInList<T>(T value, params T[] args)
    {
    return Array.IndexOf(args, value) != -1;
    }
  • 考虑到 args,您的方法命名可能有点误导是一个数组,而不是 List<T> .

关于c# - 函数的通用约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3794646/

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