【问题标题】:Compare if string that user inputs exists in list using C#使用 C# 比较用户输入的字符串是否存在于列表中
【发布时间】:2018-02-12 13:54:28
【问题描述】:

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

我收到一个错误:

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

【问题讨论】:

  • 您将Artical 对象与字符串值进行比较。将其更改为 => x.name, k.name

标签: c# .net string linq


【解决方案1】:

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

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

请注意,Remove

从列表中删除特定对象的第一个匹配项

此外,您需要确保比较对象中的所有其他值(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);
}

【讨论】:

  • 谢谢!我不再有错误,但我的对象没有从列表中删除。你知道为什么吗?
  • 太棒了!谢谢你的回答!
  • @user9347049 我添加了另一种删除对象的方法。看看我的编辑
【解决方案2】:

如果您需要获取字符串,则不需要将其放入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);
      }

    }
}

【讨论】:

    猜你喜欢
    • 2015-07-02
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多