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

时间:2014-02-19 11:43:42

标签: c# collections

我有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'

6 个答案:

答案 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;


        }
    }