我在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并将其转换为数组或列表?
答案 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]);
}
}
}