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);
        }
    }
}

mcここで、パラメータとして送信される、オブジェクトに含まれるすべての数値を別の配列で必要とする「X」メソッドを想定してみましょう。

私の最初のアイデアは、for、新しい整数配列であり、それぞれの位置に1つずつコピーします。しかし、MyClassが異なる場合は、文字列と浮動小数点数があり、文字列を引き出したいので、別の「X」メソッドに必要な配列を作成するには、forを内部で完全に再定義する必要があります。

たとえば、Sum、Average、Count、その他の数値関数のジェネリック、そしてもちろん、ラムダ式との組み合わせなど、Linqが大いに役立つケースを知っています。

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

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 に答える
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 に答える