使用C#

时间:2018-02-12 13:54:28

标签: c#

我正在尝试比较用户输入的字符串是否存在于列表中,如果确实如此,我想将其从列表中删除。

我收到错误:

  

参数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带下划线并给出了我上面提到的错误。

2 个答案:

答案 0 :(得分:3)

错误来自于您尝试将Artical类型的对象与string进行协调。 lambda表达式中的x代表List<Artical>中的一个元素,因此您需要使用它访问属性name,因为这是您要比较的内容:

if (articals.Exists(x => string.Equals(x.name, k.name, StringComparison.OrdinalIgnoreCase)))

请注意,Remove

  

从List

中删除第一次出现的特定对象

此外,您需要确保比较对象中的所有其他值(priceweight)必须与您要查找的值匹配,否则该项目不会被删除!

编辑:

你可以做的是使用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);
      }

    }
}