从List(T)中检索属性,除了FOR EACH之外的任何选项

时间:2012-03-15 12:52:30

标签: .net linq list

我知道我可以使用FOR EACH轻松实现下面的目标,但是我遇到这种情况很多,并且想知道是否有更优雅的解决方案。

Class Foo
    Public X as String
    Public Y as Integer   
End Class

Dim c As New List(Of Foo) = GetFooItemsFromDatabase......

我想在c中获得所有X的逗号分隔字符串。如果我有一个名为simpleArray的简单字符串数组,我可以执行类似

的操作
dim s as String = String.Join(", ", simpleArray)

有没有办法构建simpleArray(LINQ,内置函数等)来实现这一目标而不必使用FOR EACH并自己构建它?

编辑:似乎LINQ是要走的路。但是,将许多建议从C#转换为VB会产生以下编译器不喜欢的内容。

Dim s As String = c.[Select](Function(myVal) myValue.X)

4 个答案:

答案 0 :(得分:2)

好的,这是C#,所以道歉,但你可以使用一点LINQ:

string.Join(", ", c.Select(c => c.X).ToArray());

Select扩展方法允许您投射输出,您基本上使用c的可枚举数并将其投影到X的可枚举数。然后,您拨打ToArrayIEnumerable<string>翻译成string[](使用C#白话)。

在VB.NET中完全支持LINQ,非常值得阅读:

http://msdn.microsoft.com/en-us/library/bb763068.aspx

如果您是初学者,“LINQ”的标准命名往往涵盖新语法:

from name in names 
select name

还有扩展方法的幌子:

.Select().Where().OrderBy(); //.etc()

VB.NET LINQ源:

http://www.wrox.com/WileyCDA/Section/LINQ-Extension-Methods-with-Visual-Basic-2008.id-310907.html

答案 1 :(得分:1)

使用C#和.NET 4.0,

string s = string.Join(", ", c.Select(x => x.X));

和VB.NET相同的代码

Dim s As String = String.Join(", ", c.[Select](Function(x) x.X))

使用.NET 4,您无需再调用ToArray()

答案 2 :(得分:1)

你可以这样做:

var s = String.Join(", ", c.Select(foo => foo.X));

或者你可以使用它:

var s = c.Select (foo => foo.X).Aggregate((p, c) => p + ", " + c);

答案 3 :(得分:1)

你不能这样做:

String.Join(",", c.Select(item=>item.X).ToArray())