首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Collection<string>不能接受字符串值

Collection<string>不能接受字符串值
EN

Stack Overflow用户
提问于 2014-02-19 11:43:42
回答 6查看 107关注 0票数 0

我有Silverlight应用程序,我有页面Home.xaml(它的代码隐藏Home.xaml.cs),.There是按钮。单击该按钮时,将打开OpenFileDialog,然后从计算机*.txt文件中进行更改。将其转换为数据stream.then调用完全是另一个类Processr.cs,其中该数据流将处理并将结果添加到Coolection中。问题,我的结果val不能添加到集合中。执行下列代码:

Home.xaml.cs:

代码语言:javascript
复制
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

代码语言:javascript
复制
 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’

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-02-19 11:48:03

您正在返回一个方法,而不是一个Instance object --这是为什么要获得此异常消息的原因。此外,你做错了你的处理。

这里有个解决办法

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-02-19 11:45:52

Add方法Collection<>不返回集合本身。它是不可链子的。

另外,您的实现将在添加了return (第一项,而不是所有项)之后进行,我假设这是您想要的。

试试这个:

代码语言:javascript
复制
    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关键字使用自定义迭代器。这样,文件的全部内容就不需要同时在内存中,而是一次只需要一行。

票数 3
EN

Stack Overflow用户

发布于 2014-02-19 11:49:39

Add不返回任何东西(void),这就是为什么您会得到异常。您必须返回实现ICollection<string>的内容。你可以用ToList

代码语言:javascript
复制
return matches.Select(m => m + Environment.NewLine).ToList();

您还将返回一个集合,其中包含一个循环中的一个条目,这是没有意义的。

备注:由于您正在添加Environment.NewLine,我想您实际上需要一个单独的字符串,其中每个匹配都用一个新行分隔。然后可以使用String.Join (更改返回类型):

代码语言:javascript
复制
return string.Join(Environment.NewLine, matches);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21879471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档