我有一种方法可以阅读文本文件。 我必须在文本文件中获得以" ART"。
开头的单词我有一个循环遍历该方法的foreach循环。
class ProductsList
{
public static void Main()
{
String path = @"D:\ProductsProjects\products.txt";
GetProducts(path, s => s.StartsWith("ART"));
//foreach (String productin GetProducts(path, s => s.StartsWith("ART")))
//Console.Write("{0}; ", word);
}
我的方法如下:
public static String GetProducts(String path, Func<String, bool> lambda)
{
try {
using (StreamReader sr = new StreamReader(path)){
string[] products= sr.ReadToEnd().Split(' ');
// need to get all the products starting with ART
foreach (string s in products){
return s;
}
}
}
catch (IOException ioe){
Console.WriteLine(ioe.Message);
}
return ="";
}
}
我在方法中遇到lambda的问题,我不熟悉lambda&s,而且我真的不知道如何在方法中应用lambda。 / p>
对不起,如果我不能那么好地解释自己。
答案 0 :(得分:2)
只需将其添加到此处
foreach (string s in products.Where(lambda))
<强>更新强>
您应该像这样更改方法,以返回产品列表,而不仅仅是单个
public static IEnumerable<string> GetProducts(String path, Func<String, bool> lambda)
{
using (StreamReader sr = new StreamReader(path))
{
string[] products = sr.ReadToEnd().Split(' ');
// need to get all the products starting with ART
foreach (string s in products.Where(lambda))
{
yield return s;
}
}
}
答案 1 :(得分:1)
你的代码是错误的,因为它只返回一个字符串,你想要返回多个字符串,如果产品列表很大,这也可能需要一段时间,我建议这样做:< / p>
public static IEnumerable<string> GetProducts(string path, Func<string, bool> matcher)
{
using(var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None))
{
using(var reader = new StreamReader(stream))
{
do
{
var line = reader.ReadLine();
if (matcher(line)) yield return line
}while(!reader.EndOfFile)
}
}
}
然后使用它就像:
foreach(var product in GetProducts("abc.txt", s => s.StartsWith("ART")))
{
Console.WriteLine("This is a matching product: {0}", product);
}
此代码的好处是返回与谓词(lambda)匹配的所有行,以及使用迭代器块执行此操作,这意味着它实际上不会读取下一行,直到您要求它