Using Visual Basic // C#
使用Visual Basic // C#
I'm trying to search through my stored arrays for a match to the user input. For example, the user has stored the data for a USB, and now wishes to bring that information back up.
我正在尝试搜索我存储的数组以匹配用户输入。例如,用户已经存储了USB的数据,现在希望重新获得该信息。
FULL CODE BELOW
以下完整代码
I'm already using IndexOf to find the array index, but now i want to search that index for a match to the user's input. This line of code:
我已经使用IndexOf来查找数组索引,但现在我想搜索该索引以匹配用户的输入。这行代码:
if (ProductNameArray.Any(usersearch.Contains))
has come up with the error that
我想出了那个错误
System.Array does not contain a definition for 'Any'
System.Array不包含“Any”的定义
but it has worked in other code for me.
但它在我的其他代码中有效。
I cannot seem to figure this out, any help is appreciated.
我似乎无法弄清楚这一点,任何帮助表示赞赏。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Linq;
namespace Prac_Test3
{
class Program
{
// Constants
const int SIZE_OF_PRODUCT_CODE = 4;
const float CATEGORY_A_MARKUP = 10.0F;
const float CATEGORY_C_MARKUP = 33.3F;
const float CATEGORY_P_MARKUP = 15.0F;
const int ARRAY_SIZE = 100;
static void DisplayMenu()
{
Console.Clear();
Console.WriteLine("--------------> Menu <------------");
Console.WriteLine("1. Add a product (a)");
Console.WriteLine("2. Find a product (f)");
Console.WriteLine("3. Enter the quantity in stock (q)");
Console.WriteLine("4. Delete a product (d)");
Console.WriteLine("5. Calculate and display values (v)");
Console.WriteLine("6. Exit (x)");
Console.Write("\r\nEnter your selection: ");
}
static void AddProduct( string[] ProductNameArray, string[] ProductCodeArray, float[] WholesalePriceArray, ref int NextAvaliablePosition)
{
string ProductName = "";
string ProductCode = "";
string ProductCategory = "";
float WholesalePricePerItem = 0.0F;
bool ParseResult = false;
bool ErrorFlag = false;
string UserResponse = "";
do
{
ErrorFlag = false;
Console.Write("Product Name : ");
ProductName = Console.ReadLine();
if (ProductName == "")
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Product Name must not be left blank.");
Console.ForegroundColor = ConsoleColor.Gray;
ErrorFlag = true;
}
} while (ErrorFlag);
do
{
ErrorFlag = false;
Console.Write("Product Code : ");
ProductCode = Console.ReadLine();
if (ProductCode == "")
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Product Name must not be left blank.");
Console.ForegroundColor = ConsoleColor.Gray;
ErrorFlag = true;
}
else if (ProductCode.Length != SIZE_OF_PRODUCT_CODE)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Product Code must be exactly four characters.");
Console.ForegroundColor = ConsoleColor.Gray;
ErrorFlag = true;
}
else
{
ProductCategory = ProductCode.Substring(0, 1);
ProductCategory = ProductCategory.ToUpper();
if (ProductCategory != "A" && ProductCategory != "C" && ProductCategory != "P")
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Product Code must start with A, C or P.");
Console.ForegroundColor = ConsoleColor.Gray;
ErrorFlag = true;
}
else if (!(Char.IsDigit(ProductCode[1])) && !(Char.IsDigit(ProductCode[2])) && !(Char.IsDigit(ProductCode[3])))
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Product Code must be A, C or P followed by three digits.");
Console.ForegroundColor = ConsoleColor.Gray;
ErrorFlag = true;
}
}
} while (ErrorFlag);
do
{
ErrorFlag = false;
Console.Write("Wholesale price per item ($): ");
UserResponse = Console.ReadLine();
ParseResult = float.TryParse(UserResponse, out WholesalePricePerItem);
if (ParseResult == false)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Not a valid number.");
Console.ForegroundColor = ConsoleColor.Gray;
ErrorFlag = true;
}
else if (WholesalePricePerItem <= 0)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Wholesale price must be a number greater than 0.");
Console.ForegroundColor = ConsoleColor.Gray;
ErrorFlag = true;
}
} while (ErrorFlag);
}
static void FindProduct(Array ProductNameArray)
{
int search = -1;
string usersearch;
usersearch = Console.ReadLine();
search = Array.IndexOf(ProductNameArray, usersearch);
if (search >=0)
{
if (ProductNameArray.Any(usersearch.Contains))
{
Console.WriteLine(" details blah blah");
}
}
else if (search <0)
{
Console.WriteLine("No record exists.");
}
3 个解决方案
#1
You need using System.Linq;
for that to work.
你需要使用System.Linq;为了工作。
Any
is an extension method defined in LINQ.
Any是LINQ中定义的扩展方法。
Also, pay attention to the type of ProductNameArray
. If it is defined as Array
(and not string[]
, for example), the compiler has no way of inferring that, when enumerated, it'll yield string
s.
另外,请注意ProductNameArray的类型。如果它被定义为Array(而不是string [],例如),则编译器无法推断枚举时它将产生字符串。
In that case, you'd have to write:
在这种情况下,你必须写:
if (ProductNameArray.Cast<string>().Any(usersearch.Contains))
Edit: OK, looking at the code it seems that the problem is the one described above.
编辑:好的,看看代码似乎问题是上面描述的问题。
You'll have to change the signature of the FindProduct
method from
您必须更改FindProduct方法的签名
static void FindProduct(Array ProductNameArray)
to
static void FindProduct(string[] ProductNameArray)
or use the .Cast<string>
method.
或使用.Cast
I'd personally prefer changing the method's signature, since the ProductNameArray
passed to it seems to really be a string[]
.
我个人更喜欢更改方法的签名,因为传递给它的ProductNameArray似乎真的是一个字符串[]。
#2
Any()
is an extension method in System.Linq
namespace. You have to add using System.Linq;
so that you can use it.
Any()是System.Linq命名空间中的扩展方法。你必须使用System.Linq添加;这样你就可以使用它了。
namespace Your.Namespace
{
using System;
using ... // your other usings
using System.Linq;
public sealed class YourClass
{
public void Test()
{
// ...
yourArray.Any()
}
}
}
#3
Add below to you code
在下面添加代码
using System.Linq;
#1
You need using System.Linq;
for that to work.
你需要使用System.Linq;为了工作。
Any
is an extension method defined in LINQ.
Any是LINQ中定义的扩展方法。
Also, pay attention to the type of ProductNameArray
. If it is defined as Array
(and not string[]
, for example), the compiler has no way of inferring that, when enumerated, it'll yield string
s.
另外,请注意ProductNameArray的类型。如果它被定义为Array(而不是string [],例如),则编译器无法推断枚举时它将产生字符串。
In that case, you'd have to write:
在这种情况下,你必须写:
if (ProductNameArray.Cast<string>().Any(usersearch.Contains))
Edit: OK, looking at the code it seems that the problem is the one described above.
编辑:好的,看看代码似乎问题是上面描述的问题。
You'll have to change the signature of the FindProduct
method from
您必须更改FindProduct方法的签名
static void FindProduct(Array ProductNameArray)
to
static void FindProduct(string[] ProductNameArray)
or use the .Cast<string>
method.
或使用.Cast
I'd personally prefer changing the method's signature, since the ProductNameArray
passed to it seems to really be a string[]
.
我个人更喜欢更改方法的签名,因为传递给它的ProductNameArray似乎真的是一个字符串[]。
#2
Any()
is an extension method in System.Linq
namespace. You have to add using System.Linq;
so that you can use it.
Any()是System.Linq命名空间中的扩展方法。你必须使用System.Linq添加;这样你就可以使用它了。
namespace Your.Namespace
{
using System;
using ... // your other usings
using System.Linq;
public sealed class YourClass
{
public void Test()
{
// ...
yourArray.Any()
}
}
}
#3
Add below to you code
在下面添加代码
using System.Linq;