1

私はC#で関数を持っています void func(int x, int y, params object[] arr)

これで、この arr には何でも含めることができます。たとえば、[0] に配列、[1] に文字列などを含めることができます。

次のパラメータを渡すと:func(3, 4, array1, list1, "hello");

array1 は int の配列、list1 はリストです

私の質問は、arr から array1 と list1 を抽出し、配列またはリストに変換するにはどうすればよいですか?

4

6 に答える 6

3
Array myArray = (Array) arr[0];
List<int> myList = (List<int>) arr[1];

また

Array myArray = arr[0] as Array;
List<int> myList = arr[1] as List<int>;
于 2012-08-27T11:27:33.387 に答える
3

Type.IsArrayプロパティを使用できます

public static void func(int x, int y, params object[] arr)
{
    var test = arr.Where(r => r.GetType().IsArray);
}

そして、あなたはそれを次のように呼び出します:

 int[] arr = new int[] {1,2,3};
 func(1, 2, 2, 4, arr);
于 2012-08-27T11:31:32.193 に答える
1

できるよ

void func(int xx, int yy, params object[] arr)
    {
        object value = arr[0];
        Type valueType = value.GetType();
        if (valueType.IsArray)
        {
            Array myArray = (Array)arr[0];
        }

        value = arr[1];
        valueType = value.GetType();
        if (valueType.IsGenericType)
        {
            List<int> myList = (List<int>) arr[1];
        }        
    }
于 2012-08-27T11:39:44.650 に答える
1

ここに小さなプログラムがあります。arr は何でも作成できると述べたので、最初のインデックスにはリスト、配列、文​​字列、またはその他のものがある可能性があり、多くの配列またはリストが渡される可能性があると思います。
したがって、特定のインデックスで特定のタイプの要素が期待できると想定しないでください。このソリューションは、arr からすべての配列とすべてのリストを抽出します。多分それはあなたにとって役立つかもしれません。

class Program
{
    static void Main(string[] args)
    {
        int[] array1 = new int[10];
        var list1 = new List<int>() { 0, 1, 52 };
        var list2 = new List<string>() { "Mike" };

        func(3, 4, array1, list1, "hello", list2);

    }

    static void func(int x, int y, params object[] arr)
    {
        // Gets all lists and arrays from arr
        IEnumerable<object> listsAndArrays = arr.Where(a => a is IList);
        // Gets all arrays from arr
        IEnumerable<object> arrays = arr.Where(a => a is Array);
        // Gets all lists from arr
        IEnumerable<object> lists = arr.Where(a => a.GetType().IsGenericType && a.GetType().GetGenericTypeDefinition() == typeof(List<>));
    }
}
于 2012-08-27T12:01:46.570 に答える
1
var items = arr.Where(x => x.GetType() == typeof(IEnumerable<object>));
foreach (var item in items)
{
    if (item is List<object>) 
    {
        (item as List<object>).Add("test123");
    }
    else if (item is object[]) {...}
}

このようなものが解決策になるはずです。

于 2012-08-27T11:28:09.980 に答える
0

私があなたを正しく理解した場合:

    void func(int x, int y, params object[] arr)
    {
        foreach (var a in arr)
        {
            if (a.GetType().IsArray)
            {
                var internalArray = ((Array)a).OfType<object>().ToArray();
                Console.WriteLine(internalArray[0]);
            }
            else if (a is IList)
            {
                var internalList = (IList)a;
                Console.WriteLine(internalList[0]);
            }
        }
    }
于 2012-08-27T11:41:20.627 に答える