2014-09-11 3 views
2

목록의 항목을 문자열로 변환하려고합니다. 하지만 매번 변환하거나 표시 할 때마다 "TwitchIrcChar.user"가 표시됩니다. 어떤 사람이이 일을 도울 수 있다면 매우 도움이 될 것입니다. 죄송하지만 멍청한 질문이지만 목록에 새로 온 것은 아닙니다. ive는 convert.ToString 및 userlist.tostring을 사용하여 시도했습니다. 둘 다 같은 출력을 내었습니다.list.ToString이 올바른 출력을 표시하지 않습니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Media; 

namespace TwitchIrcChat 
{ 
class User 
{ 

    static Random random = new Random(); 
    public string UserName { get; set; } 
    public SolidColorBrush Color { get; set; } 
    public bool IsMod { get; set; } 

    public User(string username) 
    { 
     IsMod = false; 
     UserName = username; 
     randomColor(); 
    } 

    public void setColor(SolidColorBrush color) 
    { 
     Color = color; 
    } 

    private void randomColor() 
    { 
     var temp = Brushes.White; 
     int randomColor = random.Next(0, 10); 
     switch (randomColor) 
     { 
      case 0: 
       temp = Brushes.Blue; 
       break; 
      case 1: 
       temp = Brushes.Green; 
       break; 
      case 2: 
       temp = Brushes.Red; 
       break; 
      case 3: 
       temp = Brushes.Purple; 
       break; 
      case 4: 
       temp = Brushes.Orange; 
       break; 
      case 5: 
       temp = Brushes.Yellow; 
       break; 
      case 6: 
       temp = Brushes.Gold; 
       break; 
      case 7: 
       temp = Brushes.Teal; 
       break; 
      case 8: 
       temp = Brushes.Cyan; 
       break; 
      case 9: 
       temp = Brushes.LightBlue; 
       break; 
      case 10: 
       temp = Brushes.Pink; 
       break; 
     } 
     Color = temp; 
    } 
} 

class UserList 
{ 
    public moderation q = new moderation(); 
    public List<User> userList { get; set; } 

    public UserList() 
    { 
     userList = new List<User>(); 
    } 

    public void Add(string userName) 
    { 
     bool isInList = false; 
     foreach (var item in userList) 
     { 
      if (item.UserName.Equals(userName)) 
      { 
       isInList = true; 
       break; 
      } 
     } 
     if (!isInList) 
     { 
      var tempUser = new User(userName); 
      userList.Add(tempUser); 
     } 
    } 

    public void Remove(string userName) 
    { 
     int userLocation = -1; 
     for (int i = 0; i < userList.Count; i++) 
     { 
      if (userName.Equals(userList[i].UserName)) 
      { 
       userLocation = i; 
       break; 
      } 
     } 
     try 
     { 
      userList.RemoveAt(userLocation); 
     } 
     catch (Exception) 
     { 
     } 
    } 

    public SolidColorBrush getColor(string username) 
    { 
     var temp = Brushes.White; 
     foreach (var item in userList) 
     { 
      if (item.UserName.Equals(username)) 
      { 
       temp = item.Color; 
      } 
     } 
     return temp; 
    } 

    public void setColor(string username, string color) 
    { 
     if (userList.Count(s => s.UserName == username) == 0) 
     { 
      Add(username); 
     } 
     var user = userList.First(s => s.UserName == username); 
     var converter = new BrushConverter(); 
     var brush = (SolidColorBrush)converter.ConvertFromString(color); 
     user.Color = brush; 
    } 

    public void Clear() 
    { 
     userList.Clear(); 
    } 

    public void list() 
    { 
     Console.WriteLine("qweqweqweqwe"); 
     for (int i = 0; i < userList.Count; i++) // Loop through List with for 
     { 
      Console.WriteLine(userList[i].ToString()); 
      Console.WriteLine("qweqweqweqwe"); 

     } 

    } 

    public void AddMod(string userName) 
    { 
     foreach (var item in userList) 
     { 
      //string a = item.ToString(); 
      //q.writeToFile(a); 
      if (item.UserName.Equals(userName)) 
      { 

       item.IsMod = true; 
      } 
     } 
    } 

} 
} 
+5

때문에 당신은'ToString()'에서'User' 클래스를 재정 의하여 User''의 캐릭터 라인 표현이 무엇인지 정의해야합니다.'User'를 명시 적으로 표시하는 방법을 명시해야합니다. 지금은 기본값을 사용하고 있습니다. –

+0

'User'의 "문자열 표현"을 어떻게 보이시겠습니까? – Icemanind

+0

http://msdn.microsoft.com/en-us/library/ms173154(v=vs.80).aspx –

답변

3

다른 사람들이 제안한 것처럼 ToString을 재정의 할 수도 있고, 아니면 UserName이 원하는 모든 것을 원할 수도 있습니다.

Console.WriteLine(userList[i].UserName.ToString()); 

또는

Console.WriteLine(userList[i].UserName); 

는 이미 문자열

+0

이것은이 경우에 효과적이지만, 만약 있다면 (또는 언제라도있을 수있다.) 개체의 문자열 표현이 필요할 수있는 다른 모든 인스턴스의 경우 해당 논리를 개체 자체에 캡슐화하는 것이 좋습니다. 그 시점에서 묻는 질문은 "사용자 이름"을 콘솔에 출력하고 있습니까 아니면 "사용자"를 콘솔에 출력하고 있습니까? 후자의 경우 논리를 '사용자'로 캡슐화합니다. – David

+0

그렇습니다. 그러나 필요하지 않은 경우 ToString을 덮어 쓸 이유가 없습니다. 또한이 경우 아마도 그가 원하는 것은 모두 UserName이고 앞으로 User.ToString은 UserName + age와 같은 것이어야합니다. – Gratzy

+0

전적으로 디버깅 용으로 사용하기 때문에이 방법이 유용합니다. 하지만 다른 모든 답변을 주셔서 감사합니다! 매우 도움이된다! – hurnhu

2

이것은 목록과는 관계가 없으며 사용자 지정 개체를 문자열로 나타내는 방법과 관련이 있습니다.

.ToString()의 기본 동작은보고있는 것과 정확히 일치하며 클래스 이름을 출력합니다. .NET은 객체를 문자열로보고 싶을 때 의미하는 바를 직관적으로 알 수있는 방법이 없습니다. 객체에 overriding .ToString()의 로직을 명시 적으로 제공해야합니다. 이다

public override string ToString() 
{ 
    return UserName; 
} 

본질적 질문 당신이 요구할 필요가, "나는 재산에 출력 있습니까 : 당신은 단지 사용자의 이름을보고 싶다면

예를 들어, 그것은 같은 간단한 될 수 있습니다 사용자 또는 사용자 자체를 출력합니까? " 후자의 경우 논리가 시간에 따라 변할 수 있으므로 해당 논리를 .ToString() 무시 기호로 캡슐화하고 싶을 것입니다. 혹시 User의 (a * 문자로, 예를 들어, 말)는 "모드"인 경우 User의 문자열 표현도 표시하려는 경우 예를 들어, 당신은 단지 재정에 그를 추가 :

public override string ToString() 
{ 
    return string.Format("{0} {1}", 
     UserName, 
     IsMod ? "(*)" : string.Empty); 
} 
2

클래스에서 ToString() 메서드를 재정의하고 해당 메서드에서 원하는 문자열을 반환해야합니다. 예를 들어 당신이 ToString()가 사용자의 인스턴스에 호출 될 때 UserName을 반환하려는 경우, 당신은 이런 식으로 작업을 수행 할 수 있습니다 이렇게하지 않으면

public class User 
{ 
    public string UserName {get;set;} 
    public override string ToString() 
    { 
     return UserName; 
    } 
} 

, 기본 ToString()은 객체의 이름을 반환합니다 유형.

1

ToString()의 기본 동작 (System.Object에서 상 속됨)은 형식 이름을 표시하는 것입니다. 이 동작을 변경하려면 당신은 ToString를 재정의해야합니다 : 당신은 또한에 대한리스트 박스에 직접 개체를 추가 할 수 있습니다

Console.WriteLine(userList[i]); 

: 당신은 단순히 다음과 같이 호출 있도록

class User 
{ 
    ... 

    public override string ToString() 
    { 
     return UserName + (IsMod ? " (moderator)" : ""); 
    } 
} 

ToStringConsole.WriteLine에 의해 자동으로 사용됩니다 예를 들어, 항목을 표시하기 위해 ToString도 사용합니다.

listBox1.Items.Add(user); 
+3

downvoter에게 : 내 대답에 무슨 문제가 있습니까? –

+0

호기심이 왜 이것이 투표에 실패 했습니까? ToString()을 재정의하는 것이 단순히 단일 속성을 추출하는 것보다 적절합니다. – Gratzy

+0

다른 누군가가'.ToString()'오버라이드 및 놓친 답을 포함하는 연속 된 답을 한 것처럼 보입니다. 또는 누군가가 연속적으로 답을 얻고 답을 놓쳤습니다. (또는 어떤 사람이이 질문에 무작위로 와서 대답을 무작위로 downvoted했다. 어느 쪽이든 개인적으로 취해야 할 것이 아니다.) – David

관련 문제