0

让我们说一个这样的程序:

class MyClass
{
    public int Numbers;
    public char Letters;
}
class Program
{
    static void Main()
    {
        var mc = new MyClass[5];
        for (var i = 0; i < 5; i++)
        {
            mc[i].Numbers = i + 1;
            mc[i].Letters = (char) (i + 65);
        }
    }
}

现在,让我们假设一个“X”方法需要包含在 object 中的所有数字mc,在一个单独的数组中,作为参数发送。

我的第一个想法是一个for,一个新的整数数组,并一个一个地复制到其各自的位置。但是,如果MyClass不同了,现在它有字符串和浮点数,我想拉出字符串,现在 for 必须在其内部完全重新定义,以便为另一个“X”方法创建所需的数组。

我知道 Linq 有很大帮助的情况,例如 Sum、Average、Count 和其他数字函数的泛型,当然,它与 lambda 表达式结合使用。

我想知道是否存在类似的东西MyClass以更快的通用方式制作上述数组(当然还有其他数组)?

4

4 回答 4

1

如果要使用 LINQ,可以执行以下操作:

int [] numbers = mc.Select<MyClass, int>(m => mc.Number).ToArray();

为了使其更通用,它会变得更复杂一些,您可能需要反射或动态对象。反射的一个简单示例是:

    private TValue[] ExtractFields<TClass, TValue>(TClass[] classObjs, string fieldName)
    {
        FieldInfo fInfo = typeof(TClass).GetField(fieldName, BindingFlags.Public | BindingFlags.Instance);
        if (fInfo != null && fInfo.FieldType.Equals(typeof(TValue)))
            return classObjs.Select<TClass, TValue>(c => (TValue)fInfo.GetValue(c)).ToArray();
        else
            throw new NotSupportedException("Unidentified field, or different field type"); 
    }

然后就这样称呼它:

int [] fields = ExtractField<MyClass, int>(mc, "Number");
于 2012-06-25T05:22:46.860 回答
0

为什么不直接使用Dictionary<int, char>,或者如果数据类型未知,那么简单Dictionary<object, object>

于 2012-06-25T04:55:23.670 回答
0

如果您的目标是生成一个与原始数组分离但包含从中复制的数据的新数组,那么您可以做的最通用的事情是定义一个方法,例如:

  T my_array[]; // 存放真实事物的数组
  U[] CopyAsConvertedArray<U>(Func<T,U> ConversionMethod);

这将允许生成一个新数组,该数组使用任何所需的方法从原始数组中提取项目。

于 2012-06-25T20:41:24.067 回答
0

如果您使用的是 C# 4.0,那么您可以使用动态

class MyClass
{
    public dynamic Numbers;
    public char Letters;
}

编辑:基于评论

我不确定这是否是您想要的:

int[] arr = mc.Select(a => a.Numbers).ToArray<int>();

或不铸造

int[] arr = mc.Select(a => a.Numbers).ToArray();
于 2012-06-25T04:54:36.687 回答