我正在尝试将列表中的项目转换为字符串。但每次我转换它或显示它所有的节目都是" TwitchIrcChar.user"。如果有人可以帮助解决这个问题,那将非常有帮助。对不起,如果noob问题,但我是新的列表。香港专业教育学院尝试使用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;
}
}
}
}
}
答案 0 :(得分:3)
您可以像其他人建议的那样覆盖ToString,或者如果UserName是你想要的那样,那么就可以。
Console.WriteLine(userList[i].UserName.ToString());
或
Console.WriteLine(userList[i].UserName);
因为它已经是一个字符串
答案 1 :(得分:2)
这与列表无关,而与将自定义对象表示为字符串的方式有关。
.ToString()
的默认行为正是您所看到的,输出了该类的名称。当您想要将对象视为字符串时,.NET无法直观地了解您的意思。您需要在对象上通过overriding .ToString()
明确提供该逻辑。
例如,如果您只想查看用户的姓名,可能会有以下简单内容:
public override string ToString()
{
return UserName;
}
基本上,你需要问自己的问题是,&#34;我是在输出用户的属性,还是输出用户本身?&#34;如果是后者,您肯定希望将该逻辑封装到.ToString()
覆盖中,因为该逻辑可能会随时间而变化。例如,如果您希望User
的字符串表示也显示User
是否为&#34; mod&#34; (例如,使用*
字符),您只需在覆盖中添加:
public override string ToString()
{
return string.Format("{0} {1}",
UserName,
IsMod ? "(*)" : string.Empty);
}
答案 2 :(得分:2)
您必须在类中重写ToString()
方法,并在该方法中返回所需的字符串。例如,如果您想在用户实例上调用UserName
时返回ToString()
,则可以这样做:
public class User
{
public string UserName {get;set;}
public override string ToString()
{
return UserName;
}
}
如果不这样做,默认的ToString()
将返回对象类型的名称。
答案 3 :(得分:1)
ToString()
(继承自System.Object
)的默认行为是显示类型名称。如果要更改此行为,则必须覆盖ToString
:
class User
{
...
public override string ToString()
{
return UserName + (IsMod ? " (moderator)" : "");
}
}
{p> ToString
由Console.WriteLine
自动使用,因此您只需将其称为:
Console.WriteLine(userList[i]);
您也可以将对象直接添加到列表框中,因为这些对象也会使用ToString
来显示项目。
listBox1.Items.Add(user);