私のVBは非常に錆びていて、かなり古くなっています(約10年前の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を使用してVBではなくC#を使用していますが(IDEであれば使用しています)あなたは実際に正しいコードを持っていましたが、IntelliSenseはそれを認識しませんでした。
IntelliSenseはかなりコンパイルされていますが、コンパイラではありません。タイプするうちに私たちの速度を低下させる危険があるため、コンパイラとして多くのリソースを費やすことはできません。
ちなみに、はではありません。実際には目的のリストが必要でない限り、ToList
に電話してください。 collct
が、データベースまたはファイルから何かを読み込む際に何千ものオブジェクトを返す列挙型としてロードされているとします。
ToList
に電話をかけると、最初のデータが到着するとすぐに反復処理が開始され、一度に一度に少数のメモリを使用するだけで済みます。
ToList
を呼び出すと、メモリ内の大量のリストにすべてのオブジェクトがロードされるまで、プログラムはその行に止まり、For Each
を開始します。
もちろん、リストを前後に移動したり、繰り返しを行う前にカウントを知る必要がある場合は、For Each
を繰り返すよりもToList
を呼び出す方がいいでしょう。しかし、あなたがを知っていない場合は、それを使用する必要がありますを知っている。
これはあなたの質問に答えることはできませんが、ちょうど始めているのであれば、VBの代わりにC#を学ぶことを強くお勧めします。あなたに役立つ多くのサンプルコードと記事があります。 – danludwig
私は@olivehourを知らないのですが、いつも私が知りたいことのどこかでWeb上でチュートリアルを書いている人を除いて、すべての世界コードがC#であるようです。 –