在列表<产品> </product>中搜索产品名称

时间:2014-05-06 07:23:14

标签: c# list search

该功能实现了列表中产品的搜索。我在if循环中的返回类型中收到错误。如果产品应该是什么样的返回类型 如果找不到productname,那么找到了什么应该是返回类型?应该将值返回到main()方法中的哪个变量?

namespace Sample
{

    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
    } 

    class Program
    {
        public static Product SearchProductsByName(string ProductsName, List<Product> products)
        {
            Product pd;
            pd= new Product();
            foreach (Product rs in products)
            {
                if (ProductsName == rs.Name)
                {
                    return pd;
                }
            }   
        }
    }

    static void Main(string[] args)
    {
        Product res=new Product();
        Console.WriteLine("Enter the name of the product");
        string pname = Console.ReadLine();
        res=SearchRestaurantsByName(pname , products);
    }

5 个答案:

答案 0 :(得分:6)

就这样说:

public static Product SearchProductsByName(string ProductsName, List products) {
  foreach (Product rs in products) 
    if (ProductsName == rs.Name)
      return rs; // <- The product found

  return null; // <- There's no such a product in the list
}

编辑:对于Main方法,预计会出现类似的情况:

static void Main(string[] args) {
  // You should declare and fill in the products list
  // where you'll be looking for the product
  List<Product> products = new List<Product>() {
    //TODO: Replace it with the actual products
    new Product() {Name = "Product A"},
    new Product() {Name = "Product B"},
    new Product() {Name = "Product C"}
  };

  // Ask user for the product name
  Console.WriteLine("Enter the name of the product");

  string pname = Console.ReadLine();

  // The product user's looking for
  Product res = SearchRestaurantsByName(pname, products);

  //TODO: change this for required response to user
  if (res != null) 
    Console.WriteLine("The product is found");  
  else 
    Console.WriteLine("The product is not found");  
}

答案 1 :(得分:3)

return products.Where( m => m.Name == ProductsName ).FirstOrDefault();

对上述代码的一点解释。

FirstOrDefault 与First几乎相同。不同之处在于它如何处理空集合。如果集合为空,则返回该类型的默认值。此方法简化了代码。在某些程序中,它消除了异常。

在这种情况下,当没有产品具有匹配的ProductName

时,它将返回null

答案 2 :(得分:2)

为什么你需要一个单独的方法呢?使用LinQ通过某个属性查找对象,如下所示:

string name = Console.ReadLine();
var foundPropduct = products.FirstOrDefault(p => p.Name == name);

如果找到了产品,则会foundProduct为结果,否则为null

答案 3 :(得分:1)

你可以这样做:

var prod =products.SingleOrDefault(x=>x.Name == ProductName);

return prod;

你的方法就像:

public static Product SearchProductsByName(string ProductsName, List<Product> products)

{

            Product pd = products.SingleOrDefault(x=>x.Name == ProductName);


            return pd;
}

在我看来,你不需要制作一个单独的方法,而不是使用SingleOrDefault

答案 4 :(得分:1)

您提到的编译错误是由于未找到匹配项时未返回值 。即使总是匹配,编译器也不知道,所以它必须抱怨任何代码能够在没有返回值的情况下退出:

e.g。您现有的功能应为:

    public static Product SearchProductsByName(string ProductsName, List<Product> products)
    {
        Product pd;
        pd= new Product();
        foreach (Product rs in products)
        {
            if (ProductsName == rs.Name)
            {
                return pd;
            }
        }   
        return null;    // <<< Return a value if nothing was found
    }

然而...

...正如您在C#中所写的那样,是时候开始使用LINQ了。

迭代,搜索等是LINQ的设计目的。通过使用LINQ,您可以编写更少的代码并提高工作效率,减少错误(假设标准做法是更多行=更多错误):

您的代码可能会变成:

static void Main(string[] args)
{
    Product res=new Product();
    Console.WriteLine("Enter the name of the product");
    string pname = Console.ReadLine();
    res = products.SingleOrDefault(x=>x.Name == ProductName);
}

有趣的x=>x.Name == ProductName被称为lambda表达式。它基本上就像一个小函数,它传递每个值(如x)并返回比较x.Name == ProductName的布尔结果。如果有帮助,请将x视为头部中的C#this

SingleOrDefault只返回lambda表达式返回true的第一个项。如果没有匹配的项目,则会返回“默认”,对象为null

在这种情况下,您可以使用许多LINQ方法。 Where(x=>x.Name == ProductName)将返回所有匹配项的集合(实际上是iEnumerable)。 FirstOrdefault()几乎与SingleOrDefault完全相同。唯一的区别是SingleOrdefault意味着只有一个匹配(产品数据就是这种情况)。 FirstOrDefault表示可能存在多个匹配项,但您并不关心哪一个匹配。

基本上我强烈建议您开始学习LINQ的好处并停止编写函数来执行简单的单行查询操作。