我有Silverlight应用程序。我有页面Home.xaml(和它的代码隐藏Home.xaml.cs)。有按钮。当我点击按钮,OpenFileDialog打开,我从我的电脑* .txt文件更改。将它转换为数据流。然后完全调用另一个类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'
答案 0 :(得分:3)
Add
的{{1}}方法不会返回。它不可链接。
此外,在添加第一个项目之后,您的实施将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
关键字来寻找自定义迭代器。这样,文件的整个内容不必一次在内存中,而是一次只有一行。
答案 1 :(得分:1)
您正在返回一个方法而不是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;
}
答案 2 :(得分:1)
Add
不返回任何内容(void
),这就是您获得异常的原因。你必须返回实现ICollection<string>
的东西。您可以使用ToList
:
return matches.Select(m => m + Environment.NewLine).ToList();
你也在循环中返回一个带有一个项目的集合,这是没有意义的。
旁注:由于你要添加Environment.NewLine
,我猜你实际上想要一个字符串,其中每个匹配用换行符分隔。然后你可以使用String.Join
(更改返回类型):
return string.Join(Environment.NewLine, matches);
答案 3 :(得分:0)
Add方法不返回值。要解决此问题,最好的选择是替换
行return new Collection<object>().Add(val);
与
return new Collection<object>() { val };
答案 4 :(得分:0)
使用此代码代替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;
}
答案 5 :(得分:0)
从代码中删除无意义的循环 While
以及此类字符串代码:
var val = match + Environment.NewLine;
<强> Processor.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;
}
}