私は、たくさんのオブジェクトを作成し、各オブジェクトのPriority
プロパティを設定するために繰り返します。IEnumerable - foreachループ内のオブジェクトを更新する
static void Main(string[] args)
{
foreach (var obj in ObjectCreator.CreateObjectsWithPriorities())
Console.WriteLine(String.Format("Object #{0} has priority {1}",
obj.Id, obj.Priority));
}
class ObjectCreator
{
public static IEnumerable<ObjectWithPriority> CreateObjectsWithPriorities()
{
var objs = new[] { 1, 2, 3 }.Select(i => new ObjectWithPriority() { Id = i });
ApplyPriorities(objs);
return objs;
}
static void ApplyPriorities(IEnumerable<ObjectWithPriority> objs)
{
foreach (var obj in objs)
{
obj.Priority = obj.Id * 10;
Console.WriteLine(String.Format("Set priority of object #{0} to {1}", obj.Id, obj.Priority));
}
}
}
class ObjectWithPriority
{
public int Id { get; set; }
public int Priority { get; set; }
}
私は修正の優先順位を持つオブジェクトを格納するための主な方法でIEnumerable
を期待しています。
Set priority of object #1 to 10
Set priority of object #2 to 20
Set priority of object #3 to 30
Object #1 has priority 0
Object #2 has priority 0
Object #3 has priority 0
sucheの行動の理由は何であり、私が働いて、私の優先順位を取得するために、ここで何を変更する必要があります。しかし、それらのすべては、デフォルト値0ここで ログがあるがありますか?
二つの重要な事実:(1)クエリ式の値が*問い合わせ*であり、(2)クエリが実行されます*クエリが実行されたとき*。これらのステートメントはトートロジーに見えるかもしれませんが、あなたのコードは、あなたがそれらを信じていないことを示しています。クエリの値はクエリの実行であり、それを2回実行することは一度だけ実行すると信じていました。 –
@EricLippert、そうです、私はいつも、IEnumerableを、(名前が示すように)クエリの表現ではなく、_enumerate_を通じた一連の要素として考えました。また、シーケンスをループするだけで(要素を追加したり削除したりする必要がない)場合は、ToListを呼び出さずに、プログラム全体でIEnumerableを安全に使用することができます。多くの書籍や記事が提案するように、メソッド/クラス/プログラムの間でオブジェクトを渡すためには、「可能な限り一般的な型を使用する必要があります。」と私がここでやろうとしていたことです。今私はそれよりも複雑だと思う。 –