Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换列表<;T>;列出<;字符串>;一般地_C#_Linq_Collections - Fatal编程技术网

C# 转换列表<;T>;列出<;字符串>;一般地

C# 转换列表<;T>;列出<;字符串>;一般地,c#,linq,collections,C#,Linq,Collections,我有一个在运行时反思一组属性的情况。当我得到实际的属性值时,它只是object类型,但我做了一个检查以确认它是一个泛型列表。在我的场景中,这些通用列表将始终包含某种类型的基本值(int、string、long等)。有没有一种简单的方法可以将任何类型的列表转换为字符串列表?像这样: object obj = pi.GetValue(item, null); Type type = obj.GetType(); if (type.IsGenericType && type.GetGe

我有一个在运行时反思一组属性的情况。当我得到实际的属性值时,它只是object类型,但我做了一个检查以确认它是一个泛型列表。在我的场景中,这些通用列表将始终包含某种类型的基本值(int、string、long等)。有没有一种简单的方法可以将任何类型的列表转换为字符串列表?像这样:

object obj = pi.GetValue(item, null);
Type type = obj.GetType();
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) {
    List<string> lstStrings = ???;
}
objectobj=pi.GetValue(项,空);
Type Type=obj.GetType();
if(type.IsGenericType&&type.GetGenericTypeDefinition()==typeof(列表)){
列表字符串=???;
}
或者我必须先使用一个大的switch语句并转换为适当的运行时列表类型,然后再将其转换为List


谢谢

将列表转换为非泛型类型。

IEnumerable
运行良好,但在将其转换为
IEnumerable
之前,您在可用方法方面受到限制。一旦有了
IEnumerable
,就可以使用
ToString()
将元素转换为字符串

var list = ((IEnumerable)obj).OfType<object>();
List<string> strings = list.Select(x => x.ToString()).ToList();
var list=((IEnumerable)obj).OfType();
List strings=List.Select(x=>x.ToString()).ToList();

将列表强制转换为非泛型类型。

IEnumerable
运行良好,但在将其转换为
IEnumerable
之前,您在可用方法方面受到限制。一旦有了
IEnumerable
,就可以使用
ToString()
将元素转换为字符串

var list = ((IEnumerable)obj).OfType<object>();
List<string> strings = list.Select(x => x.ToString()).ToList();
var list=((IEnumerable)obj).OfType();
List strings=List.Select(x=>x.ToString()).ToList();

在if语句中,将对象强制转换为IEnumerable。你知道这是安全的,因为它是一个列表。然后,您可以使用可枚举静态方法
Cast
Select

List<String> list = ((IEnumerable)obj).Cast<Object>().Select(x => x.ToString());
List List=((IEnumerable)obj.Cast().Select(x=>x.ToString());

在if语句中,将对象强制转换为IEnumerable。你知道这是安全的,因为它是一个列表。然后,您可以使用可枚举静态方法
Cast
Select

List<String> list = ((IEnumerable)obj).Cast<Object>().Select(x => x.ToString());
List List=((IEnumerable)obj.Cast().Select(x=>x.ToString());

完全重写我的答案,请试一试。完全重写我的答案,请试一试。我提出了类似的解决方案,但在类型的
之前找到了
Cast
方法。区别在于类型的
执行过滤。因为一切都是一个
对象
,所以这很好。我想知道这是否会稍微增加运行时开销?无论如何,检查某个东西是否是对象可能是高度优化的。@MichaelWelch我怀疑从性能角度看过滤是否相关。我以前被误用Cast()而烧坏了,所以我通常坚持使用OfType(),因为它有过滤掉空值的额外好处。感谢您提供有关OfType
信息。事实上,我以前从未遇到过它。@MichaelWelch没问题。我一直在使用它将非泛型集合转换为IEnumerable,这样我就可以在它们上使用其他Linq方法。@不经意的Sage-Yep做到了,这就是我所缺少的部分,将它从基本接口转换为IEnumerable,而不必显式地告诉它T是什么,谢谢,我提出了类似的解决方案,但在类型
之前找到了
Cast
方法。区别在于类型的
执行过滤。因为一切都是一个
对象
,所以这很好。我想知道这是否会稍微增加运行时开销?无论如何,检查某个东西是否是对象可能是高度优化的。@MichaelWelch我怀疑从性能角度看过滤是否相关。我以前被误用Cast()而烧坏了,所以我通常坚持使用OfType(),因为它有过滤掉空值的额外好处。感谢您提供有关OfType
信息。事实上,我以前从未遇到过它。@MichaelWelch没问题。我一直在使用它将非泛型集合转换为IEnumerable,这样我就可以在它们上使用其他Linq方法。@不经意的Sage-Yep,成功了,这就是我缺少的部分,从基本接口将其转换为IEnumerable,而不必显式地告诉它T是什么,谢谢