集合<string>不能接受字符串值



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

        }
    }

最新更新