该功能实现了列表中产品的搜索。我在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);
}
答案 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)
您提到的编译错误是由于未找到匹配项时未返回值 。即使总是匹配,编译器也不知道,所以它必须抱怨任何代码能够在没有返回值的情况下退出:
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的好处并停止编写函数来执行简单的单行查询操作。