2

この式を例として使用すると、かなり複雑な式があり、var を明示的な変数に置き換えたいとしますか?

var collection = Enumerable.Range(0, 10)
   .Where(x => x % 2 != 0)
   .Reverse()
   .Select(x => new { 
                       original = x, 
                       sqrt = Math.Sqrt(x) 
                    });

変数を置き換えるためにかなりの数の組み合わせを試しましたが、エラーが発生し続けることはありません。ああ、VSがタイプを教えてくれるのは本当に役に立たなかった...

たとえば、私は交換しようとしました

var collection

IEnumerable<KeyValuePair<int, double>> collection
4

4 に答える 4

4

newオブジェクトを選択しているため、結果はAnonymous Typeであり、それらを使用して var の代わりに型を使用することはできません。

于 2013-09-05T08:48:13.277 に答える
2

本当にそこに何かを置きたい場合は、使用できます

IEnumerable<dynamic> collection = Enumerable.Range(0, 10).Where(x => x % 2 != 0)
      .Reverse()
      .Select(x => new { original = x, sqrt = Math.Sqrt(x) });

式で匿名オブジェクトを作成しているため、それ以上のことはできません。

Jeppe Stig Nielsen のコメントを読んで、できるのにそうすべきではない理由の詳細な説明を読んでください。

于 2013-09-05T08:48:53.187 に答える
1

あなたは多分このようなものが欲しいですか

IEnumerable<KeyValuePair<int, double>> collection = 
        Enumerable.Range(0, 10)
                  .Where(x => x%2 != 0)
                  .Reverse()
                  .Select(x => new KeyValuePair<int, double> (x,Math.Sqrt(x)));
于 2013-09-05T08:54:10.207 に答える
0

最もクリーンな方法は、匿名型を明示的に宣言されたクラスに変えることだと思います。

public static void Main(string[] args)
{
    IEnumerable<WithRoot> collection = Enumerable.Range(0, 10)
       .Where(x => x % 2 != 0)
       .Reverse()
       .Select(x => new WithRoot(x, Math.Sqrt(x)));    
}

private sealed class WithRoot
{
    public WithRoot(int orig, double root)
    {
        this.Original = orig;
        this.SquareRoot = root;
    }

    public int Original { get; private set; }

    public double SquareRoot { get; private set; }
}

これにより、完全な型安全性を維持しながら、コード内で型に名前を付けることができます(dynamicまたはを使用したソリューションとは対照的objectです)。ただし、コードがより冗長になります。率直に言って、あなたがそれを必要としているとは思えませんし、明示的な型付けのためだけにそれを行うことはお勧めしません. var悪い/悪ではない.

機能の違い:コード サンプルではEqualsGetHashCode上書きされないことに注意してください。これは、匿名型を使用する場合にも自動的に発生します。

于 2013-09-05T08:58:32.760 に答える