我知道我可以使用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)
答案 0 :(得分:2)
好的,这是C#,所以道歉,但你可以使用一点LINQ:
string.Join(", ", c.Select(c => c.X).ToArray());
Select
扩展方法允许您投射输出,您基本上使用c
的可枚举数并将其投影到X
的可枚举数。然后,您拨打ToArray
将IEnumerable<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())