2009-09-28 4 views
0

List 유형의 멤버가 하나있는 클래스를 만들었습니다. 그러면 ClassNameInstance.Add()을 사용하여이 값을 더할 수 있습니다.C# : 클래스 반환 값 - 또는 더 좋은 방법이 있습니까?

우리는 이제 내가 만든 모든 클래스와 그 값을 자동으로 사용할 제 3 자의 코드를 사용하고 있습니다. 목록 제외. 목록의 첫 번째 요소 만 반환합니다.

내가 필요한 것은 써드 파티 코드를 사용하기 위해 쉼표로 구분 된 버전을 반환했습니다. 이제 문자열을 String 멤버에 추가 할 수는 있지만이 방법은 .Add() 메서드처럼 좋지 않습니다. 내가 좋아하는 것

MyClass1.Add("Test1"); 
MyClass1.Add("Test2"); 

Console.WriteLine(MyClass2); 

출력은 Test1, Test2 될 것입니다 :

그래서 난에 대한 추가() 메소드를 가질 수 있지만, 지금처럼 그 하나의 값에 액세스 할 수 있습니다 내 자신의 클래스를 창조하고 싶었다. 나는 이것이 의미가 있기를 바란다!

업데이트 1 :

위의 내용이 분명하지 않을 수 있습니다.

public class MyClass1 
{ 
    ???? 
} 

public class MyClass2 
{ 
    MyClass1 mc1 { get; set; } 
    String name { get; set; } 
} 

타사 코드는 MyClass2와 해당 값을 사용합니다. MyClass1 대신 List를 사용할 때 목록의 첫 번째 값만 가져 오지만 CSV 목록은 반환 된 String으로 필요합니다.

MyClass2 mc2 = new MyClass2(); 

mc2.mc1.Add("Test1"); 
mc2.mc1.Add("Test2"); 

Console.WriteLine(mc2.mc1) should output -> Test1, Test2 

희망 사항이 더 많아집니다.

감사합니다. :)

UPDATE2 :

그것은 모든 사람이 같은 일을 제안 것 같다 - 사용 ToString을().

제 3 자 코드는 내 클래스를 살펴보고 멤버 유형과 값을 자동으로 결정합니다. 즉, ToString()을 호출하여 반환되는 값을 코드에 전달할 수 없습니다.

목록의 추가/제거 기능이 필요하지만 그 값을 사용하면 단일 CSV 문자열로 반환됩니다.

public sealed class StringJoiningList 
{ 
    private readonly List<string> list = new List<string>(); 

    public void Add(string item) 
    { 
     list.Add(item); 
    } 

    public override string ToString() 
    { 
     return string.Join(", ", list.ToArray()); 
    } 
} 

: 당신은 그냥 자동으로 ToString에서 호출하려면 클래스에서이 동작을 포장 할 수

List<string> list = new List<string>(); 
list.Add("Test1"); 
list.Add("Test2"); 
Console.WriteLine(string.Join(", ", list.ToArray()); 

:

+0

대답은 지금까지 당신의 질문의 두 번째 부분에 대답하는 것,하지만 난 그 첫 번째 부분과 결합하여 어떻게 확실히 이해할 수없는 인정해야 - 당신의 타사 코드는 (A ToString을 수행) 수업에? – Benjol

+0

@Benjol : 소스 코드를받지 못 했으므로 정확히 무엇을하는지 확신 할 수 없습니다. 사실 내 수업을 두 번째 수업에서 사용하고 싶습니다. 이 두 번째 클래스는 타사 코드와 함께 사용되므로 불행히도 ToString()을 사용할 수 없습니다. – neildeadman

답변

0

내가 원하는 답변은 아니지만 원하는대로 할 수없는 것으로 보입니다.

두 번째 클래스를 멤버로 사용하려는 클래스에서 필자는 해당 멤버를 String으로 만들었으므로 제 3 자 코드가 원하는대로 작동 할 수있었습니다.

공용 멤버로 List<String>을 가진 두 번째 클래스를 만든 다음 .ToCSV()이라는 메서드를 사용하여이 목록을 csv 문자열로 출력합니다. Class1.Class2.Add()을 저장하지 않고 목록에 문자열을 추가하는 .Add() 메서드를 추가했습니다. 타사 코드 내 클래스를 사용하는 것이 바로 전에

그럼, 내가 할 :

MyClass1.MyString = MyClass2.ToCSV(); 

따라서 나는 방법에 대한 라운드에서 원하는 기본적으로 걸 포기!

누구나 입력 해 주셔서 감사합니다.

8

난 당신이 여기에 별도의 클래스가 필요 모르겠어요 이제 그저 List<string>을 원한다고 가정 할 때 - 기타 방법보다 ToString() 방법에 액세스하는 것을 허용하지 않습니다. 당신이 더 많은 정보를 줄 수 있다면, 물론 그 모든 것은 고칠 수 있습니다.

public class StringJoiningList<T> : List<T> 
{ 
    public override string ToString() 
    { 
     return string.Join(", ", this.Select(x => x.ToString()).ToArray()); 
    } 
} 

내가 아이디어를 좋아하지 완전히 확실하지 않다, 그러나 당신이해야 할 일에 따라 달라집니다 ... : 당신 도 단지 List<T>에서 파생

+0

제 3 자 코드가 클래스 이름 (위의 편집 된 원래 질문의 MyClass2)을 전달하기 때문에 ToString을 사용할 수 없으며 해당 형식을 찾아 값을 사용합니다. – neildeadman

+0

위의 클래스 중 하나를'MyClass1'로 사용하면'Console.WriteLine'가'ToString' 자체를 호출하기 때문에 테스트 케이스가 작동합니다. 제 3 자의 클래스가 그렇지 않다면, 우리는 그것이 무엇을하는지 알 필요가 있습니다. –

+0

나는 위의 클래스를 시도하고 실제로 Console.WriteLine과 함께 작동하지만 슬프게도 작동하지 않는 제 3 자 코드를 사용합니다. – neildeadman

1

몇 가지 쉬운 옵션은 클래스의 ToString() 메서드를 재정의하는 것입니다 (이 컨텍스트에서 사용되는 경우 쉼표로 분리 된 항목 목록을 반환합니다). 또는 해당 항목을 평평하게하는 속성을 제공 할 수 있습니다 명부.

0

ToString 메서드를 구현해야합니다.

0

가장 간단한 해결책은 아마도 StringCollection 클래스에서 상속 받고 ToString을 재정의하는 것입니다. 그렇지 않으면이 클래스에는 이미 사용자가 요청한 모든 것이 있습니다.

public class MyClass : System.Collections.Specialized.StringCollection 
{ 
    public override string ToString() 
    { 
     var c = new string[this.Count]; 
     this.CopyTo(c,0); 
     return string.Join(",", c); 

    } 
} 

그럼 전에 시도했던 것처럼 사용할 수 있습니다. 이 간단한 사용법에 대해 제네릭을 사용하지 않아도됩니다.

편집 :

클래스 자체는 반환 값이없는, 그래서 제 3 자 코드를 읽고 특성을해야합니다. 위에서 설명한대로 ToString()을 재정의 한 다음 ToString()을 반환하는 속성을 표시 할 수 있어야합니다. 그건 아마 내가 IEnumerable을 < T의 항목을 가입 쓴 확장의 제 3 자 코드 여기

public class MyClass : System.Collections.Specialized.StringCollection 
{ 
    public string MyValue 
    { 
     get { return this.ToString(); } 
    } 

    public override string ToString() 
    { 
     var c = new string[this.Count]; 
     this.CopyTo(c,0); 
     return string.Join(",", c); 

    } 
} 
+0

타사 코드가 호출 될 때를 제외하고이 코드는이 클래스를 포함하는 클래스의 인스턴스를 전달합니다. 클래스를 자동으로 처리하므로 ToString을 사용하지 않습니다. 원래의 질문을 더 잘 설명하여 편집했습니다. – neildeadman

+0

위의 답변을 조정했습니다. 나는 아직도이 메커니즘이 당신의 문제를 해결할 수 있다고 생각합니다. –

0

에 문자열 값을 표시 할 것 >

 
public static string Join<T>(this IEnumerable<T> collection, 
          string separator, Func<T, object> selector) 
{ 
    if (null == separator) 
     throw new ArgumentException("separator"); 
    if (null == selector) 
     throw new ArgumentException("selector"); 

    Func func = item => 
    { 
     var @object = selector(item); 
     return (null != @object) ? @object.ToString() : string.Empty; 
    }; 
    return string.Join(separator, collection.Select(func).ToArray()); 
} 

그것은 다음과 같이 사용할 수 있습니다

 
List<Person> list = new List<Person>() 
{ 
    new Person() { FirstName = "Magic", LastName = "Johnson" }, 
    new Person() { FirstName = "Michael", LastName = "Jordon" }, 
    new Person() { FirstName = "Larry", LastName = "Bird" } 
}; 

var value = list.Join(", ", p => p.FirstName); 

// value is "Magic, Michael, Larry" 
관련 문제