【问题标题】:Template list creation C#模板列表创建 C#
【发布时间】:2020-04-26 21:06:35
【问题描述】:
public static void GenerateRandomd<T>(D_List<T> list, int size, Random rand)
    {
        if (list is D_List<int>)
        {
            for (int i = 0; i < size; i++)
                list.Push_Back(rand.Next(0, 10000));
        }
        else if (list is D_List<string>)
        {
            for (int i = 0; i < size; i++)
                list.Push_Back(Gen_rand_string(rand));
        }
        else
        {
            for (int i = 0; i < size; i++)
                list.Push_Back(rand.NextDouble());
        }
    }  

你好!有可能实现这样的事情吗?提前谢谢你。

【问题讨论】:

  • 您能否澄清(最好使用words)您想要实现的目标?确实有可能获得帖子中显示的代码进行编译...(即通过具有通用 Push_Back&lt;T&gt; 以及非通用 Push_Back(double))但这可能不是您想要实现的...
  • 旁注:您是在寻找“模板”(如在编译时使用 T4 之类的代码生成)还是“泛型”(问题中使用的代码)?使用错误的标签预计会带来您不感兴趣的答案。
  • 如果我尝试执行此代码,它将返回错误“无法从“int”转换为“T””。是否有可能在离开作业时以某种方式避免这种情况?

标签: c# templates linked-list


【解决方案1】:

您只需要将list 变量转换为pattern matching:

public static void GenerateRandomd<T>(D_List<T> list, int size, Random rand)
{
    switch (list)
    {
        case D_List<int> il:
            for (int i = 0; i < size; i++)
                il.Push_Back(rand.Next(0, 10000));
            break;
        case D_List<string> sl:
            for (int i = 0; i < size; i++)
                sl.Push_Back(Gen_rand_string(rand));
            break;
        default:
            for (int i = 0; i < size; i++)
                (list as D_List<double>).Push_Back(rand.NextDouble());
    }
}

或者你可以直接在你的代码中转换它:

public static void GenerateRandomd<T>(D_List<T> list, int size, Random rand)
{
    if (list is D_List<int>)
    {
        for (int i = 0; i < size; i++)
            (list as DList<int>).Push_Back(rand.Next(0, 10000)); // cast variable to the DList<int> at each step of the cyclecast
    }
    else if (list is D_List<string>)
    {
        for (int i = 0; i < size; i++)
            (list is D_List<string>).Push_Back(Gen_rand_string(rand));
    }
    else
    {
        for (int i = 0; i < size; i++)
            (list is D_List<double>).Push_Back(rand.NextDouble());
    }
}  

如果默认方案意味着不同的类型,那么您可以为 D_List 实现非泛型 Push_Back(double value) 方法。

【讨论】:

  • 第一个变种是最好的! Спасибо большое!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
相关资源
最近更新 更多