programing

IEnumberable 컬렉션에 항목을 추가하려면 어떻게 해야 합니까?

golfzon 2023. 4. 9. 22:39
반응형

IEnumberable 컬렉션에 항목을 추가하려면 어떻게 해야 합니까?

위의 제목과 같은 질문입니다.예를들면

IEnumerable<T> items = new T[]{new T("msg")};
items.ToList().Add(new T("msg2"));

개 1 개 1 、 개 1 、 있 1 、 있 1 、 안 돼요?items.Add(item)List<T>

수 .왜냐하면, 「 」는 「 」이기 때문입니다.IEnumerable<T>는 반드시 항목을 추가할 수 있는 컬렉션을 나타내는 것은 아닙니다.사실, 그것은 반드시 컬렉션을 나타내는 것은 아닙니다!예를 들어 다음과 같습니다.

IEnumerable<string> ReadLines()
{
     string s;
     do
     {
          s = Console.ReadLine();
          yield return s;
     } while (!string.IsNullOrEmpty(s));
}

IEnumerable<string> lines = ReadLines();
lines.Add("foo") // so what is this supposed to do??

단, 할 수 있는 것은 새로운 것을 만드는 것입니다. IEnumerable개체(지정되지 않은 유형의 개체)를 열거하면 이전 항목의 모든 항목과 사용자 항목의 일부가 제공됩니다.은 you 다 you you youEnumerable.Concat경우 : 우 for :

 items = items.Concat(new[] { "foo" });

어레이 오브젝트는 변경되지 않습니다(어차피 어레이에 항목을 삽입할 수 없습니다).그러나 배열 내의 모든 항목을 나열하는 새 개체를 만든 다음 "Foo"를 만듭니다.또한 이 새 개체는 배열의 변경 사항을 추적합니다(즉, 항목을 열거할 때마다 항목의 현재 값이 표시됩니다).

" " "IEnumerable<T>는 이러한 작업을 지원하지 않습니다.IEnumerable<T>interface는 소비자가 컬렉션의 내용을 볼 수 있도록 하는 것입니다.값을 변경하지 않습니다.

.ToList(). Add()를 .List<T>그 리스트에 값을 추가합니다.이치노

Add extension을 .IEnumerable<T>이치노

items = items.Add("msg2");

IEnumerable<T> 하실 수 있습니다.이는 참조를 유지함으로써 확인할 수 있습니다.를 들면, 「」

var items = new string[]{"foo"};
var temp = items;
items = items.Add("bar");

이 연산 집합 후에 변수 온도는 여전히 값 집합에서 단일 요소 "foo"를 가진 열거형만 참조하는 반면, 항목은 "foo" 및 "bar" 값을 가진 다른 열거형을 참조합니다.

편집

가 Add의 인 확장 .IEnumerable<T>왜냐하면 이게 제가 최종적으로 정의하는 첫 번째 것 중 하나이기 때문입니다. 있습니다.

public static IEnumerable<T> Add<T>(this IEnumerable<T> e, T value) {
  foreach ( var cur in e) {
    yield return cur;
  }
  yield return value;
}

대신 또는 인터페이스를 사용하는 것을 고려하셨습니까?이러한 이유는, 이 인터페이스들은,AddIEnumerable<T>.

IEnumerable<T>유형을 '표시'하는 데 사용됩니다.실제 기본 객체가 항목의 추가/보증을 지원하는지 여부를 보증하지 않고 열거형 또는 일련의 항목만 지원합니다., 이러한 는 「」, 「」를 실장하고 있는 해 주세요.IEnumerable<T>이 다 요.IEnumerable<T>뿐만 아니라.

Core에는 .net Core라는 .Enumerable.Append그게 바로 그거지.

메서드의 소스 코드는 GitHub에서 사용할 수 있습니다.구현(다른 답변의 제안보다 더 복잡함)은 살펴볼 가치가 있습니다.

에서의 몇 가지IEnumerable ★★★★★★★★★★★★★★★★★」IEnumerable<T>위해 그것을 해 주세요.

public static IEnumerable Append(this IEnumerable first, params object[] second)
{
    return first.OfType<object>().Concat(second);
}
public static IEnumerable<T> Append<T>(this IEnumerable<T> first, params T[] second)
{
    return first.Concat(second);
}   
public static IEnumerable Prepend(this IEnumerable first, params object[] second)
{
    return second.Concat(first.OfType<object>());
}
public static IEnumerable<T> Prepend<T>(this IEnumerable<T> first, params T[] second)
{
    return second.Concat(first);
}

우아함(일반적이지 않은 버전은 제외).이 메서드가 BCL에 없는 것이 유감입니다.

ㅇㅇㅇㅇㄹㄹㄹㄹㄹㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴ.IEnumerable는 아이템 추가를 지원하지 않습니다. 해결 은 ★★★★★★★★★★★★★★★★★★★★★★.

var myList = new List(items);
myList.Add(otherItem);

두 번째 메시지를 추가하려면 다음 작업을 수행해야 합니다.

IEnumerable<T> items = new T[]{new T("msg")};
items = items.Concat(new[] {new T("msg2")})

말을 에 온 입니다.Enumerable.Concat 또 이 있는 것 같아요.Enumerable.Append1..NET Core 1.1.1이 되다.후자를 사용하면 단일 항목을 기존 시퀀스에 연결할 수 있습니다. 아몰의은 '아몰이하다'로 쓸 도 있습니다.

IEnumerable<T> items = new T[]{new T("msg")};
items = items.Append(new T("msg2"));

단, 이 함수는 입력 시퀀스를 변경하지 않고 지정된 시퀀스와 추가된 아이템을 합친 래퍼만 반환합니다.

할 수 뿐만 아니라 아이템을 할 수 .List<T> ( 읽기 읽기 전용').InvalidOperationException( ) )

의 데이터 쿼리에서 " " 를 할 수 .Concat장장: :

: : 는 the the the the the를 사용했습니다.Union이 예의 내선번호는 정확하지 않습니다.중복되는 쿼리가 중복되지 않도록 응용 프로그램에서 광범위하게 사용합니다.

IEnumerable<T> itemsA = ...;
IEnumerable<T> itemsB = ...;
IEnumerable<T> itemsC = ...;
return itemsA.Concat(itemsB).Concat(itemsC);

은 '왜'에 수 는 안 되는)을 해 주셨습니다.IEnumerable. 컬렉션을 나타내는 인터페이스에 대한 코딩을 계속하고 추가 메서드를 필요로 하는 경우에만 추가하겠습니다.추가된 bonanza로서 이러한 인터페이스는 구현됩니다.IEnumerable.

당신은 이걸 할 수 있다.

//Create IEnumerable    
IEnumerable<T> items = new T[]{new T("msg")};

//Convert to list.
List<T> list = items.ToList();

//Add new item to list.
list.add(new T("msg2"));

//Cast list to IEnumerable
items = (IEnumerable<T>)items;

가장 간단한 방법은

IEnumerable<T> items = new T[]{new T("msg")};
List<string> itemsList = new List<string>();
itemsList.AddRange(items.Select(y => y.ToString()));
itemsList.Add("msg2");

IEnumerable 인터페이스를 구현하기 때문에 목록을 IEnumerable로 반환할 수도 있습니다.

IEnumerable 및 IEnumerator(IEnumerable에서 반환됨)를 구현하는 인스턴스에는 변경 수집을 허용하는 API가 없으며 인터페이스는 읽기 전용 API를 제공합니다.

컬렉션을 실제로 변경하는 두 가지 방법은 다음과 같습니다.

  1. 인스턴스가 write API(예: List)를 사용하는 컬렉션인 경우 다음과 같은 유형의 캐스팅을 시도할 수 있습니다.

IList<string> list = enumerableInstance as IList<string>;

  1. 들어 LINQ 메서드 IEnumerable).toList():

var list = enumerableInstance.toList();

IEnumerable items = 열거형입니다.빈(T)

일부 값 = new List()를 나열합니다.

[ items . To List ( ) ]을 클릭합니다.항목을 추가합니다(someValues).ToList().Add Range(일부 값);

정말 오래된 질문을 되살려서 죄송합니다만, 첫 번째 구글 검색 결과 목록에 올라있기 때문에 어떤 사람들은 계속 여기에 도착하고 있다고 생각합니다.

많은 답변 중 몇 가지는 매우 유용하고 잘 설명되고 있습니다.문제가 잘 특정되지 않았기 때문에 다른 점을 덧붙이고 싶습니다.

데이터를 저장하는 변수를 선언하는 경우, 항목을 추가하여 변수를 변경할 수 있어야 합니다.따라서 IEnumberable로 선언하면 안 됩니다.

@NightOwl888 제안대로

이 예에서는 IEnumerable 대신 IList를 선언합니다.IList 항목 = new T[]{new T("msg")}, 항목.추가("new T("msg2"));

선언된 인터페이스 제한을 바이패스하려고 하면 잘못된 선택을 한 것만 나타납니다.이 외에도 다른 구현에 이미 존재하는 것을 구현하기 위해 제안된 모든 방법은 디콘소싱해야 합니다.항목을 추가할 수 있는 클래스 및 인터페이스가 이미 있습니다.왜 항상 다른 곳에서 이미 한 일을 재현합니까?

이러한 고려사항은 인터페이스 내의 변수 기능을 추상화하는 것을 목적으로 합니다.

TL;DR : IMO는 필요한 작업을 수행하는 가장 깨끗한 방법입니다.

// 1st choice : Changing declaration
IList<T> variable = new T[] { };
variable.Add(new T());

// 2nd choice : Changing instantiation, letting the framework taking care of declaration
var variable = new List<T> { };
variable.Add(new T());

IEnumberable로 변수를 사용해야 하는 경우 다음과 같은 작업을 수행할 수 있습니다.어레이로 사용할 필요가 있는 경우는, 「ToArray()」라고 부를 수 있습니다.이것은 항상 간단해야 합니다.확장 방식 불필요, 정말 필요한 경우에만 캐스팅, 변수에 LinQ를 사용할 수 있는 기능 등...

선언/인스턴스 할 때 실수만 했으니 이상한 짓이나 복잡한 짓은 그만두세요.

내가 너무 늦었을 수도 있지만 앞으로 누구에게나 도움이 됐으면 좋겠어.

삽입 기능을 사용하여 특정 인덱스에 항목을 추가할 수 있습니다. list.insert(0, item);

물론 가능합니다(T-비즈니스는 별도로 하겠습니다).

public IEnumerable<string> tryAdd(IEnumerable<string> items)
{
    List<string> list = items.ToList();
    string obj = "";
    list.Add(obj);

    return list.Select(i => i);
}

언급URL : https://stackoverflow.com/questions/1210295/how-can-i-add-an-item-to-a-ienumerablet-collection

반응형