2009-08-28 5 views
4

예 : 나는이 작업을 수행 할 수 있도록 방법 체인과 유창한 언어를 구현하는 사용자 지정 컬렉션 클래스의 ICollectionAdd 방법을 가지고 싶다 :ICollection을 C#으로 더 유창하게 만드는 멋진 간단하고 우아한 방법이 있습니까?

randomObject.Add("I").Add("Can").Add("Chain").Add("This"). 

내가 몇 가지 옵션을 생각할 수 있지만,이 지저분하다 다른 인터페이스에 ICollection을 래핑하는 등의 작업을 수행합니다.

+0

왜 그냥 컬렉션 클래스에 AddRange (IEnumerable을 항목) 메소드를 추가? – BFree

+0

패션, 뷰티 & 스타일. 나는 할 수 있었다. 그러나 내가 그것을 또 다른 방법으로 할 수 있는지 궁금하게 생각하고 있었다. – danmine

답변

3

ICollection에 설정된 방법대로 Add에서 void를 반환해야합니다. 그게 하나의 매개 변수를 취하는 체인 된 Add 메소드를 배제하는 것이라고 나는 믿는다.

원하는 것은 아니지만 맞춤 컬렉션 유형에 이와 같은 것을 추가 할 수 있습니다.

public CustomCollectionType Append(string toAdd) 
{ 
    this.Add(string toAdd); 
    return this; 
} 

그런 다음 당신은 할 수 : 도움이

customCollection.Append("This").Append("Does").Append("Chain"); 

희망,

+0

+1 대신 추가를 사용합니다. 내가 remmember 수있는 ​​모든 장소가 반환 무효 또는 항목을 추가했습니다. 수집하지 마십시오. Add를하면 콜렉션 종류가 규칙을 위반하게됩니다. –

0

당신은 당신의 사용자 지정 컬렉션 클래스의 방법을 ICollection.Add 숨기고이를 반환 할 수 있습니다.

public class MyList<T>:List<T> 
{ 
    public new MyList<T> Add(T item) 
    { 
    (this as ICollection<T>).Add(item); 
    return this; 
    } 
} 

당신은 연쇄 추가 통화에 항목을 추가 할 수 있습니다

MyList<string> strList = new MyList<string>(); 
strList.Add("Hello").Add(" ").Add("World!"); 
+0

이 방법으로 사용자 지정 컬렉션 클래스에서 ICollection을 구현할 수 있습니까? –

+0

ICollection 을 암시 적으로 구현하면 동일한 클래스에 동일한 서명이있는 두 개의 Add 메서드가 있기 때문에 그렇게 생각하지 않습니다. 반환 유형 만 다르지만 컴파일러는 반환 형식을 메서드 오버로드를 구분하지 않습니다. 그러나 ICollection 을 명시 적으로 구현하면 Add 메서드가 함께 존재할 수 있습니다. –

+0

downvotes의 이유를 아는 것이 좋을 것입니다. –

2

또 다른 옵션은 C#을 수집 이니셜 라이저 사용하는 것입니다 :

var list = new YourList<String>() 
    { 
     "Hello", 
     "World", 
     "etc..." 
    }; 
5

당신은 또한 확장 방법을 사용할 수를 그 ICollection<T>과 함께 사용할 수 있으며 자신의 컬렉션 수업을 작성하지 않아도됩니다.

유창가 좋은 반면
public static ICollection<T> ChainAdd<T>(this ICollection<T> collection, T item) 
{ 
    collection.Add(item); 
    return collection; 
} 
11

, 나는 AddRange (또는 2) 추가에 더 관심이있을 거라고 :

public static void AddRange<T>(this ICollection<T> collection, 
    params T[] items) 
{ 
    if(collection == null) throw new ArgumentNullException("collection"); 
    if(items == null) throw new ArgumentNullException("items"); 
    for(int i = 0 ; i < items.Length; i++) { 
     collection.Add(items[i]); 
    } 
} 
public static void AddRange<T>(this ICollection<T> collection, 
    IEnumerable<T> items) 
{ 
    if (collection == null) throw new ArgumentNullException("collection"); 
    if (items == null) throw new ArgumentNullException("items"); 
    foreach(T item in items) { 
     collection.Add(item); 
    } 
} 

params T[] 접근 방식은 AddRange(1,2,3,4,5) 등을 허용하고 IEnumerable<T>는 LINQ 쿼리와 같은 것들로 사용할 수 있습니다.

당신은 유창하게 API를 사용하려면 제네릭 제약의 적절한 사용에 의해 원래 목록 유형을 유지, 당신은 또한 C# 3.0의 확장 방법으로 Append을 작성할 수 있습니다

public static TList Append<TList, TValue>(
     this TList list, TValue item) where TList : ICollection<TValue> 
    { 
     if(list == null) throw new ArgumentNullException("list"); 
     list.Add(item); 
     return list; 
    } 
    ... 
    List<int> list = new List<int>().Append(1).Append(2).Append(3); 

(주 그것은 List<int>)

+0

나는 혼란 스럽다. 왜 이것이 최고 등급이며 받아 들여진 대답이 아닌가? –

0

아니 위반 반환하지만 어쩌면 당신은 VB.NET

을 선호 그것은 C#을 것보다 '자연 언어'프로그램에 더 도움이 있습니다.

VB에서.NET 당신은 "과"그건 당신이 할 수있게된다 구축했다 :

With myCollection 
    .Add("Hello") 
    .Add("There") 
    .Add("My") 
    .Add("Name") 
    .Add("Is") 
    .Add("Silky") 
    .Sort() 
End With