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;
}
대신 또는 인터페이스를 사용하는 것을 고려하셨습니까?이러한 이유는, 이 인터페이스들은,Add의 IEnumerable<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를 제공합니다.
컬렉션을 실제로 변경하는 두 가지 방법은 다음과 같습니다.
- 인스턴스가 write API(예: List)를 사용하는 컬렉션인 경우 다음과 같은 유형의 캐스팅을 시도할 수 있습니다.
IList<string> list = enumerableInstance as IList<string>;
- 들어 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
'programing' 카테고리의 다른 글
| 열의 행을 Excel의 한 셀로 병합하려면 어떻게 해야 합니까? (0) | 2023.04.14 |
|---|---|
| NSString을 연결하기 위한 Objective-C 바로 가기 (0) | 2023.04.09 |
| git clone --mirror와 git clone --bare의 차이점은 무엇입니까? (0) | 2023.04.09 |
| BooleanToVisibilityConverter를 반전하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
| 메인 창을 닫을 때 WPF 앱이 종료되지 않음 (0) | 2023.04.09 |