hurnhu
hurnhu

Reputation: 936

list.ToString not showing correct output

I am trying to convert the items in a list in to a string. but every time I convert it or display it all is shows is "TwitchIrcChar.user". If some one could help with this, it would be very helpful. sorry if noob question, but im new to lists. ive tried using convert.ToString and userlist.tostring. both gave the same output

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;
            }
        }
    }

}
}

Upvotes: 2

Views: 986

Answers (4)

Olivier Jacot-Descombes
Olivier Jacot-Descombes

Reputation: 112299

The default behavior of ToString() (inherited from System.Object) is to display the type name. If you want to change this behavior you must override ToString:

class User
{
    ...

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

ToString is used automatically by Console.WriteLine, so you simply call it like this:

Console.WriteLine(userList[i]);

You can also add objects directly to listboxes for instance, as those use ToString as well in order to display the items.

listBox1.Items.Add(user);

Upvotes: 1

David
David

Reputation: 218818

This has nothing to do with lists, and everything to do with how you represent a custom object as a string.

The default behavior for .ToString() is exactly what you're seeing, outputting the name of the class. .NET has no way of intuitively knowing what you mean when you want to see an object as a string. You need to explicitly provide that logic by overriding .ToString() on your object.

For example, if you just want to see the user's name, it could be something as simple as:

public override string ToString()
{
    return UserName;
}

Essentially, the question you need to ask yourself is, "Am I outputting a property on the User, or am I outputting the User itself?" If the latter, you'd definitely want to encapsulate that logic into a .ToString() override, since that logic may change over time. For example, if you ever want the string representation of a User to also show if the User is a "mod" (say, for example, with a * character), you would just add that in the override:

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

Upvotes: 2

Gratzy
Gratzy

Reputation: 9389

You could override ToString like others have suggested or if UserName is all you rally want you just do.

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

or

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

since its already a string

Upvotes: 3

brz
brz

Reputation: 6016

You have to override ToString() method in your class and return the desired string in that method. For instance if you want to return UserName when ToString() is called on an instance of User, you can do it like this:

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

If you don't do this, the default ToString() will return the name of the object's type.

Upvotes: 2

Related Questions