28

作成するオブジェクトの数である N を受け取るメソッドがあり、N 個のオブジェクトのリストを返す必要があります。

現在、単純なループでこれを行うことができます:

    private static IEnumerable<MyObj> Create(int count, string foo)
    {
        var myList = new List<MyObj>();

        for (var i = 0; i < count; i++)
        {
            myList .Add(new MyObj
                {
                    bar = foo
                });
        }

        return myList;
    }

そして、おそらくLINQを使用してこのリストを作成する別の方法があるかどうか疑問に思っています。

私はもう試した:

    private static IEnumerable<MyObj> CreatePaxPriceTypes(int count, string foo)
    {
        var myList = new List<MyObj>(count);

        return myList.Select(x => x = new MyObj
            {
                bar = foo
            });

    }

しかし、これは私のリストに入力されているようです。

選択を foreach に変更しようとしましたが、同じ取引です。

リストにはカウントの容量があり、LINQ は反復する要素を見つけていないことに気付きました。

        myList.ForEach(x => x = new MyObj
        {
            bar = foo
        });

これを機能させるために使用する正しい LINQ 演算子はありますか? それとも、ループに固執する必要がありますか?

4

3 に答える 3

67

を使用しRangeてシーケンスを作成できます。

return Enumerable.Range(0, count).Select(x => new MyObj { bar = foo });

を作成したい場合はList、それを作成する必要がありますToList

ただし、これは (ほぼ間違いなく) 自明ではない解決策であるため、まだリストを作成する反復的な方法を捨てないでください。

于 2013-08-08T09:35:48.500 に答える
6

次のように、一般的なヘルパー メソッドを作成できます。

// Func<int, T>: The int parameter will be the index of each element being created.

public static IEnumerable<T> CreateSequence<T>(Func<int, T> elementCreator, int count)
{
    if (elementCreator == null)
        throw new ArgumentNullException("elementCreator");

    for (int i = 0; i < count; ++i)
        yield return (elementCreator(i));
}

public static IEnumerable<T> CreateSequence<T>(Func<T> elementCreator, int count)
{
    if (elementCreator == null)
        throw new ArgumentNullException("elementCreator");

    for (int i = 0; i < count; ++i)
        yield return (elementCreator());
}

次に、次のように使用できます。

int count = 100;

var strList = CreateSequence(index => index.ToString(), count).ToList();

string foo = "foo";
var myList = CreateSequence(() => new MyObj{ Bar = foo }, count).ToList();
于 2013-08-08T09:48:13.037 に答える