gpt4 book ai didi

c# - 一个单一的通用解决方案?

转载 作者:行者123 更新时间:2023-11-30 18:27:03 24 4
gpt4 key购买 nike

我想按照以下几行编写一个通用方法:

public IEnumerable<T> S<T> (List<T> source)
{
//dosomething with source
if (someCondition)
yield return null;
else
yield return someNonNullItem;
}

T 可以是值类型(例如 int)、可空类型(例如 int?)或引用类型(例如 string)。在所有这三种情况下,我都希望能够返回空值。

//dosomething block 非常通用,涉及到四处移动,并且可以与所有类型一起使用而无需修改。同样,(someCondition) bool 检查没有任何类型依赖性。

一些注意事项:

  1. 我不能使用 default(T),其中 T 是不可为 null 的值类型(例如 default(T),其中 T 是 int 将不起作用)。需要 null 的显式表示。
  2. 我不想从 T 转换为 T?如果我可以避免它,因为源列表可能很长(数百万项)。

目前,我不得不编写三个函数,其中一个函数必须有不同的名称(因为类型约束不被视为方法签名的一部分)。这三个函数具有相同的主体(为简洁起见未显示)。

    public IEnumerable<T?> S<T>(List <T> source) where T:struct
{
}

public IEnumerable<T?> S<T>(List <T?> source) where T : struct
{
}

public IEnumerable<T> S4Ref<T>(List <T> source) where T : class
{
}

在前两种方法中,我需要 T:struct 约束才能返回 Nullable。在第三种方法中:(a) 我需要一个新名称 S4Ref,以避免与第一种方法发生冲突,并且,(b) 我需要 T:class 约束才能返回 null。

实际上,我必须编写许多这样的 S 方法,如果按照上述方法,我将不得不为每个方法编写三个版本。我还将把它们变成 List 的扩展方法

问题:

  1. 有没有办法让一个单一的通用函数来做这件事?或者至少将方法从 3 种减少到 2 种?
  2. 如果不是,消除函数体中重复的最佳方法是什么?

目前我正在转向使用 T4 模板来解决这个问题。

最佳答案

您已经为自己设置了相互冲突的约束。在问题定义中,您说您想要一个适用于值类型(即 int)但能够返回 null 而无需将其转换为可空类型的函数。作为一种设计范式,我不希望事物的集合包含不存在的事物。是的,我是这么说的。对我来说,返回一个 null 项意味着它不存在,但你返回的是 null。如果函数 S 的目的是过滤项目,最好跳过不匹配的项目并返回下一个。

例如,IEnumerable 的典型用法是如下所示的代码:

    List<int> myList = ....  // somehow fill the list
foreach(int element in S(myList))
{
// do something with the int element. What should I expect to do with a null
// even if you could return one? The only thing I could reasonable do here is
// skip it. I have no idea which element of myList the null corresponds to

}

换句话说,即使 foreach 看起来像这样:

    foreach(int? element in S(myList))

我仍然不知道如何处理元素的空值。仍然没有上下文可以知道 myList 的哪个元素导致了函数 S 的空值。

关于c# - 一个单一的通用解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27409549/

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