我有Silverlight应用程序。我有页面Home.xaml(及其代码隐藏Home.xaml.cs)。有按钮。当我单击按钮时,打开文件对话框打开,我从我的计算机 *.txt 文件更改。然后完全调用另一个类 Processr.cs,其中该数据流将处理并结果将添加到 Coolection。问题,我的结果值无法添加到集合中。执行以下代码:
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);
}
}
处理器.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'
Collection<>
的Add
方法不返回集合本身。它不可链接。
此外,您的实现将在添加第一项而不是所有项目后return
,我假设您想要。
试试这个:
var result = new Collection<string>();
foreach (var match in matches)
{
var val = match + Environment.NewLine;
result.Add(val);
}
}
return result;
此外,你的代码中有很多奇怪的东西。首先,你在while
循环中调用ReadToEnd
,这实际上没有意义。其次,您没有在StreamReader
上调用Dispose
(或使用using
关键字)。
文件是否由命令组成,用换行符分隔?如果文件可能真的很大,我会使用 yield
关键字进行自定义迭代器。这样,文件的全部内容就不必一次在内存中,而一次只需一行。
您返回的是一个方法而不是一个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;
}
Add
不返回任何内容(void
),这就是您获得异常的原因。您必须返回实现ICollection<string>
的东西。您可以使用ToList
:
return matches.Select(m => m + Environment.NewLine).ToList();
您还返回了一个集合,其中包含循环中的一个项目,这是毫无意义的。
旁注:由于您要添加Environment.NewLine
我想您实际上想要一个字符串,其中每个匹配项都由换行符分隔。然后你可以使用String.Join
(更改返回类型):
return string.Join(Environment.NewLine, matches);
Add 方法不返回值。要解决此问题,最好的选择是更换线路
return new Collection<object>().Add(val);
跟
return new Collection<object>() { val };
以下代码而不是 Process 方法:
public ICollection<object> Process(Stream stream)
{
Collection<object> collection = new Collection<object>();
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;
collection.Add(val);
}
}
return collection;
}
从代码中删除了无意义的循环While
和这样的字符串代码:
var val = match + Environment.NewLine;
处理器.cs:
public class Processor
{
public IList<string> Process(Stream
stream)
{
StreamReader reader = new StreamReader(stream);
string pattern = @"set vrouter ""([w-]+)""";
List<string> myCollection = new List<string>();
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)
{
myCollection.Add(match);
}
return myCollection;
}
}