我有Silverlight应用程序,我有页面Home.xaml(它的代码隐藏Home.xaml.cs),.There是按钮。单击该按钮时,将打开OpenFileDialog,然后从计算机*.txt文件中进行更改。将其转换为数据stream.then调用完全是另一个类Processr.cs,其中该数据流将处理并将结果添加到Coolection中。问题,我的结果val不能添加到集合中。执行下列代码:
Home.xaml.cs:
private void Button_Click(object sender, EventArgs e)
{
OpenFileDialog opendialog = new OpenFileDialog();
opendialog.Multiselect = true;
bool? dialogResult = opendialog.ShowDialog();
if (dialogResult.HasValue && dialogResult.Value)
{
Stream fileStream = opendialog.File.OpenRead();
var processor = new Processor();
ICollection<string> results = processor.Process(fileStream);
}
}Processor.cs
public class Processor
{
public ICollection<string> Process(Stream stream)
{
StreamReader reader = new StreamReader(stream);
string pattern = @"set vrouter ""([\w-]+)""";
while (!reader.EndOfStream)
{
var matches =
Regex.Matches(reader.ReadToEnd(), pattern)
.Cast<Match>().Where(m => m.Success)
.Select(m => m.Groups[1].Value)
.Distinct();
foreach (var match in matches)
{
var val = match + Environment.NewLine;
return new Collection<string>().Add(val);; //here error
}
}
}这样的错误:
不能隐式地将类型'void‘转换为'System.Collections.Generic.ICollection’
发布于 2014-02-19 11:48:03
您正在返回一个方法,而不是一个Instance object --这是为什么要获得此异常消息的原因。此外,你做错了你的处理。
这里有个解决办法
public class Processor
{
public ICollection<string> Process(Stream stream)
{
StreamReader reader = new StreamReader(stream);
string pattern = @"set vrouter ""([\w-]+)""";
Collection<string> myCollection = new Collection<string>();
while (!reader.EndOfStream)
{
var matches =
Regex.Matches(reader.ReadToEnd(), pattern)
.Cast<Match>().Where(m => m.Success)
.Select(m => m.Groups[1].Value)
.Distinct();
foreach (var match in matches)
{
var val = match + Environment.NewLine;
myCollection.Add(val);; //here error
}
}
return myCollection;
}发布于 2014-02-19 11:45:52
Add方法Collection<>不返回集合本身。它是不可链子的。
另外,您的实现将在添加了return (第一项,而不是所有项)之后进行,我假设这是您想要的。
试试这个:
var result = new Collection<string>();
foreach (var match in matches)
{
var val = match + Environment.NewLine;
result.Add(val);
}
}
return result;此外,你的代码中有很多奇怪的东西。首先,在一个ReadToEnd循环中调用while,这是没有意义的。其次,您没有在您的Dispose上调用StreamReader (或者使用using关键字)。
该文件是否由命令组成,以换行符分隔?如果文件可能很大,我将使用yield关键字使用自定义迭代器。这样,文件的全部内容就不需要同时在内存中,而是一次只需要一行。
发布于 2014-02-19 11:49:39
Add不返回任何东西(void),这就是为什么您会得到异常。您必须返回实现ICollection<string>的内容。你可以用ToList
return matches.Select(m => m + Environment.NewLine).ToList();您还将返回一个集合,其中包含一个循环中的一个条目,这是没有意义的。
备注:由于您正在添加Environment.NewLine,我想您实际上需要一个单独的字符串,其中每个匹配都用一个新行分隔。然后可以使用String.Join (更改返回类型):
return string.Join(Environment.NewLine, matches);https://stackoverflow.com/questions/21879471
复制相似问题