从C#中的数组中提取数组

时间:2012-08-27 11:25:37

标签: c# arrays list

我在C#中有一个函数 void func(int x, int y, params object[] arr)

现在这个arr可以包含任何内容。对于例如它可以包含[0]处的数组,[1]处的字符串,依此类推。

如果我传递以下参数:func(3, 4, array1, list1, "hello");

array1是一个int数组,list1是一个List

我的问题是如何从arr中提取array1和list1并将其转换为数组或列表?

6 个答案:

答案 0 :(得分: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>;

答案 1 :(得分: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);

答案 2 :(得分: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[]) {...}
}

这样的事情应该是一个解决方案。

答案 3 :(得分: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];
        }        
    }

答案 4 :(得分:1)

这是一个小程序。你已经提到arr可以由任何东西组成,所以我假设在第一个索引上可以有List,array,string或其他任何东西,并且可以传递许多数组或列表。
因此,您可能不应该假设在特定索引上您可以期望特定类型的元素。 此解决方案将从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<>));
    }
}

答案 5 :(得分: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]);
            }
        }
    }