相关疑难解决方法(0)

是否存在将我的泛型方法限制为数字类型的约束?

任何人都可以告诉我是否有一种方法可以使用泛型来限制泛型类型参数T:

  • Int16
  • Int32
  • Int64
  • UInt16
  • UInt32
  • UInt64

我知道的where关键字,但无法找到一个接口只有这些类型,

就像是:

static bool IntegerFunction<T>(T value) where T : INumeric 
Run Code Online (Sandbox Code Playgroud)

c# generics constraints

350
推荐指数
11
解决办法
10万
查看次数

使用泛型类型的任何优雅方式?

我正在一个小型教育项目中工作,我们必须实现一个n维矩阵.根据上下文,此矩阵可以使用我们自己的内置ComplexNumber结构,System.Double也可以使用非常简单的示例,使用整数类型(主要是System.Int32).

由于应用程序的性质,我们不需要实现闪电般快速的性能.

因此,我的第一个想法是实行Matrix<T>地方T会以某种方式需要被限制在"数字".

这样做的一个明显问题是,语言中没有办法T用定义的运算符约束泛型类型.此外,我没有看到一种简单的方法来重新T合理到合理的类型.

我的问题是:

  1. 有人可以指出我的优雅方式,使用通用类型进行数学运算,不会过多地影响性能,并以某种方式使内置类型工作(如果可能).

  2. 如果Eric读过这篇文章,那么这个功能(通过定义的运算符约束泛型类型)是否会出现在C#设计会议的假设未来版本中,并且它是否已经接近将其纳入语言?

我知道实现一个ComplexMatrix类型并为每个矩阵"子类型"(双重,整数等)创建包装器更容易,更好,并支付我们的复杂类型和矩阵元素发生的任何类型之间的转换的性能成本成为.这个问题更多的是出于对某人如何实施类似场景的好奇心.

c# generics operators

10
推荐指数
1
解决办法
895
查看次数

将IEnumerable数值作为参数传递给方法

我正在玩一个非常简单的程序来获取一系列双打并返回标准偏差.这部分工作但我想让代码更可重用.我想这样做,所以该方法可以接受任何类型的参数,可以被认为是数字并返回标准偏差而不是硬编码双重类型(就像我最初在这个程序中做的那样).如何解决这个问题以及适当的术语是什么?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


    namespace ConsoleApplication5
    {
        class Program
        {
            static void Main(string[] args)
            {
                double[] avg = { 3.4, 55.6, 10.0, 4.5, 2, 2 };
                double x = avg.Average();
                //first round of testing
                Console.WriteLine("The average of the first array is below ");
                Console.WriteLine(x);
                Console.WriteLine("below should be the standard deviation!");
                Console.WriteLine(CalculateStandardDeviation(avg));
                Console.ReadLine();
                int[] intAvg = { 4, 3, 5, 6, 2 };
                double secondAvg = intAvg.Average();
                Console.WriteLine("The average of the second array is below "); …
Run Code Online (Sandbox Code Playgroud)

c# visual-studio-2010

9
推荐指数
2
解决办法
2万
查看次数

当调用类本身是通用的时,是否可以强制外部类调用专用的重载?

我正在编写与外部API接口的代码,我无法更改:

public class ExternalAPI
{
    public static void Read(byte[] buffer);
    public static void Read(int[] buffer);
    public static void Read(float[] buffer);
    public static void Read(double[] buffer);
}
Run Code Online (Sandbox Code Playgroud)

在读取数据时调用正确的重载方法很重要buffer,但是一旦读入数据,我将一般地处理它.我在代码中的第一次传递是:

public class Foo<T>
{
    T[] buffer;

    public void Stuff()
    {
        ExternalAPI.Foo(buffer);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,C#不会转换T[]byte[].有没有办法枚举T可以明确表示的类型?我尝试过使用一个where T :条款,但似乎没有办法说出来where T : {byte, int, float, double and nothing else ever}

按照这里的建议:匹配数字类型的通用约束,我向泛型添加了约束,并且还为我的模拟API添加了一个泛型方法,该方法将object参数作为参数

public class ExternalAPI
{
    public static void Read(object buffer);
    public …
Run Code Online (Sandbox Code Playgroud)

c# generics

7
推荐指数
1
解决办法
461
查看次数

C#泛型以避免代码重复?

我对来自Java的C#相当陌生,我想知道是否有一种简单的方法可以避免涉及原始类型的代码重复:


private Boolean AtLeastOneBufferItemIsNonZero(int[] Buffer)
{
    Boolean result = false;
    foreach (int Item in Buffer)
    {
        result = !(Item == (int)0);
        if (result) break;
    }
    return result;
}

private Boolean AtLeastOneBufferItemIsNonZero(float[] Buffer)
{
    Boolean result = false;
    foreach (float Item in Buffer)
    {
       result = !(Item == (float)0);
       if (result) break;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我找不到一个"数字"超类型,以便我可以比较一个泛型实现中的"项目"(我不介意拳击的性能损失,虽然我明白在.NET中没有这样的东西?):


//SOMETHING LIKE THIS?
private Boolean AtLeastOneBufferItemIsNonZero<T>(T[] Buffer) where T : NUMBERTYPE
{
    Boolean result = false;
    foreach (T Item in Buffer)
    {
       result = …
Run Code Online (Sandbox Code Playgroud)

c# generics primitive-types

5
推荐指数
1
解决办法
738
查看次数