我正在尝试比较用户输入的字符串是否存在于列表中,如果确实如此,我想将其从列表中删除。
我收到错误:
参数1:无法从'project.MainClass.Artical'转换为'string'
我知道我得到它因为我试图将字符串与列表进行比较。
我有结构:
struct Artical {
public string name;
public float price;
public double weight;
}
方法:
static void DeleteArtical()
{
Artical k = new Artical();
Console.WriteLine("Enter name you want to delete: ");
k.name = Console.ReadLine();
List < Artical > articals = new List < Artical > ();
using(StreamWriter sw = File.AppendText((@ "../../dat.txt"))) {
if (articals.Exists(x => string.Equals(x, k.name, StringComparison.OrdinalIgnoreCase))) {
Console.WriteLine("Done !!");
artikli.Remove(k);
}
}
}
x带下划线并给出了我上面提到的错误。
答案 0 :(得分:3)
错误来自于您尝试将Artical
类型的对象与string
进行协调。 lambda表达式中的x
代表List<Artical>
中的一个元素,因此您需要使用它访问属性name
,因为这是您要比较的内容:
if (articals.Exists(x => string.Equals(x.name, k.name, StringComparison.OrdinalIgnoreCase)))
请注意,Remove:
从List
中删除第一次出现的特定对象
此外,您需要确保比较对象中的所有其他值(price
和weight
)必须与您要查找的值匹配,否则该项目不会被删除!
编辑:
你可以做的是使用FirstOrDefault实际找出你正在寻找的结构。
此方法:
如果没有找到这样的元素,则返回满足条件的序列的第一个元素或默认值。
默认值是一个空结构,每个属性都有默认值。知道了这一点,你可以检查你的发现程序是否成功,检查是否name
有一个值。如果您已成功找到该项目,则现在可以使用同一个对象将其从列表中删除:
Artical objectForRemoval = articals.FirstOrDefault(x => string.Equals(x.name, k.name, StringComparison.OrdinalIgnoreCase));
if (!String.IsNullOrWhiteSpace(objectForRemoval.name))
{
Console.WriteLine("Done !!");
articals.Remove(objectForRemoval);
}
答案 1 :(得分:1)
如果需要获取字符串,则不需要将其放入Article
对象中。而是使用简单的string
。
并且,在您的代码中,您将整个对象与字符串进行比较,因此它会抛出错误。使用x
x.name
static void DeleteArtical()
{
string input;
Console.WriteLine("Enter name you want to delete: ");
input = Console.ReadLine();
List < Artical > articals = new List < Artical > ();
using(StreamWriter sw = File.AppendText((@ "../../dat.txt"))) {
if (articals.Exists(x => string.Equals(x.name, input, StringComparison.OrdinalIgnoreCase))) {
Console.WriteLine("Done !!");
artikli.Remove(k);
}
}
}