Что ж, я не собирался отвечать, так как мой VB и очень ржавый, и довольно устаревший (ага, VB6 около десяти лет назад). Но что-то здесь показалось неправильным с точки зрения .NET.
Ваше чтение ответа, на который вы ссылаетесь (который является неполным в своем объяснении, IMO), неверно. Дело не в том, что вам нужно поместить анонимный объект в список, а в том, что кверент там помещал его в List<object>
, что означало, что компилятор не мог определить, какие свойства у него были (он имеет дело с object
, а не с объектом рассматриваемый анонимный тип, и object
не имеет свойства Checked
).
В любом случае. Я попытался написать вашу первоначальную попытку на каком-то C # как:
private class TestType
{
public string Name{get;set;}
public TestType(string name)
{
this.Name = name;
}
}
public static void Main()
{
TestType[] collct = new TestType[]{new TestType("abc"), new TestType("def"), new TestType("xyz")};
var varbl = from itm in collct select new {n = itm.Name};
foreach(var returnedItem in varbl)
Console.WriteLine(returnedItem.n);
}
Затем я скомпилировал и декомпилировал как VB.NET в отражателе, в котором мой Main
был следующим:
Public Shared Sub Main()
Dim collct As TestType() = New TestType() { New TestType("abc"), New TestType("def"), New TestType("xyz") }
Dim varbl = (From itm In collct Select New With { _
.n = itm.Name _
})
Dim returnedItem
For Each returnedItem In varbl
Console.WriteLine(returnedItem.n)
Next
End Sub
Что очень похоже на ваш оригинал, не так ли?
Что ж, это работает; он компилируется и запускается и дает мне правильные ответы.
Единственное, о чем я могу думать, это то, что, возможно, IntelliSense здесь просто не на высоте. Я обнаружил, что несколько раз в прошлом IntelliSense изо всех сил пытается предложить имена свойств анонимных типов, и хотя я использую SharpDevelop для кодирования C #, а не VB (в любой IDE, которую вы используете), это может иметь место здесь - у вас действительно был правильный код, но IntelliSense этого не осознавал.
В конце концов, IntelliSense чертовски хорош, но это не компилятор, и он не может тратить столько ресурсов на выполнение каких-либо задач, как компилятор, из-за риска замедлить нас, пока мы печатаем.
Между прочим, вам не следует не вызывать ToList
, если вам действительно не нужен список для ваших целей. Представьте, если бы collct
был перечислением, загружаемым по мере необходимости, которое возвращало бы тысячи объектов после загрузки чего-либо из базы данных или файла.
Если вы не вызываете ToList
, тогда вы начнете перебирать их, как только поступят данные для первого, и вам нужно будет использовать память только для горстки за раз.
Если вы вызовете ToList
, программа застрянет на этой строке до тех пор, пока не загрузит каждый отдельный объект в массивный список в памяти, и только после этого запустит ваш For Each
.
Конечно, бывают случаи, когда вам действительно нужно иметь возможность перемещаться вперед и назад по списку или знать счетчик перед повторением, и тогда, безусловно, лучше позвонить ToList
, чем продолжать повторять For Each
, но если вы этого не сделаете не знаете, что вам это нужно, не используйте это.
person
Jon Hanna
schedule
16.12.2011