4

元のオブジェクトに新しいiEnumerableオブジェクトを追加したいと思います。次のような拡張メソッドで元のオブジェクトを更新することはできますか?

public static void AddItems<TSource>(this IEnumerable<TSource> orginalColl,    
IEnumerable<TSource> collectionToAdd)
{
foreach (var item in collectionToAdd)
{
    orginalColl.ToList<TSource>().Add(item);             
}             
}

私はこのように呼んでいます:OrgCollecation.PASSWORDs(newCollection)。しかし、これはうまくいかないようです。何か案が?

4

3 に答える 3

2

いいえ、あなたがすることはできません。コードでは、列挙可能なソースをリストに複製し、要素を追加して、何も返さないために忘れています。

試す

var result = orginalColl.Concat(collectionToAdd);

詳細と例については、http://msdn.microsoft.com/en-us/library/bb302894.aspxを参照してください。

于 2012-07-16T07:09:22.250 に答える
2

を追加するためのIEnumerable[<T>] ものではありません。連結(新しいシーケンスの生成)は可能ですが、元のシーケンス(/ list / array / etc)は変更されません。あなたはEnumerable.Concat、すなわちでそれを行うことができますreturn orginalColl.Concat(...)。ただし、強調:これは元のコレクションを更新しません

あなたができることは、キャストするIList[<T>]か類似することですが、それは虐待的です(そして、すべてではなく、いくつかのシナリオでのみ機能します)。IEnumerable<T>たとえば、イテレータブロック(またはではないその他のブロック)に基づくものでは機能しません。IList<T>たとえば、では機能しませんsomeSource.Where(predicte)

ソースを変更する予定の場合は、のようなものを渡すIList[<T>]必要があります。例えば:

public static void AddItems<TSource>(this IList<TSource> orginalColl,
    IEnumerable<TSource> collectionToAdd)
{
    foreach (var item in collectionToAdd)
    {
        orginalColl.Add(item);             
    }             
}

(ところで、AddRange一致するように、上記の代替名になりますList<T>.AddRange

于 2012-07-16T07:11:10.313 に答える
0

要するに、はIEnumerable<T>不変であると見なされるべきであり、それに追加することはできません。どの種類のコレクションがそれを実装しているかはわかりません。たとえば、シリアルポート入力や、列挙元のファイルシステム内の読み取り専用ファイルなどです。

コレクションに対して実行しようとしていることは、ICollection<T>より良いユースケースと一致します。フレームワークの汎用(可変)コレクションによって実装されます。

public static void AddItems<TSource>(this ICollection<TSource> orginalColl,
        IEnumerable<TSource> collectionToAdd)
{
    foreach (var item in collectionToAdd)
    {
        orginalColl.Add(item);
    }
}
于 2012-07-16T07:25:11.557 に答える