列表ToString未显示正确的输出
本文关键字:输出 显示 ToString 列表 | 更新日期: 2023-09-27 18:21:42
我正在尝试将中的列表中的项转换为字符串。但每次我转换或显示它时,都会显示"TwitchIrcChar.user"。如果有人能帮上忙,那将非常有帮助。如果没有问题,我很抱歉,但我是新来的。我试过使用convert。ToString和userlist.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;
}
}
}
}
}
您可以像其他人建议的那样覆盖ToString,或者如果UserName就是您想要做的全部。
Console.WriteLine(userList[i].UserName.ToString());
或
Console.WriteLine(userList[i].UserName);
因为它已经是一个字符串
您必须重写类中的ToString()
方法,并在该方法中返回所需的字符串。例如,如果您想在User实例上调用ToString()
时返回UserName
,您可以这样做:
public class User
{
public string UserName {get;set;}
public override string ToString()
{
return UserName;
}
}
如果不执行此操作,默认的ToString()
将返回对象类型的名称。
这与列表无关,而是与如何将自定义对象表示为字符串有关。
.ToString()
的默认行为正是您所看到的,输出类的名称。当你想把一个对象看作字符串时,NET无法直观地知道你的意思。您需要通过重写对象上的.ToString()
来显式地提供该逻辑。
例如,如果你只想查看用户名,它可以是简单的东西:
public override string ToString()
{
return UserName;
}
本质上,你需要问自己的问题是,"我是在输出用户的属性,还是在输出用户本身?"如果是后者,你肯定想将该逻辑封装到.ToString()
覆盖中,因为该逻辑可能会随着时间的推移而变化。例如,如果您希望User
的字符串表示也显示User
是否为"mod"(例如,具有*
字符),则只需将其添加到override:
public override string ToString()
{
return string.Format("{0} {1}",
UserName,
IsMod ? "(*)" : string.Empty);
}
ToString()
(继承自System.Object
)的默认行为是显示类型名称。如果要更改此行为,必须覆盖ToString
:
class User
{
...
public override string ToString()
{
return UserName + (IsMod ? " (moderator)" : "");
}
}
ToString
是由Console.WriteLine
自动使用的,所以你可以这样称呼它:
Console.WriteLine(userList[i]);
例如,您也可以直接将对象添加到列表框中,因为这些列表框也使用ToString
来显示项目。
listBox1.Items.Add(user);