从文本文件中读取行并添加到List <string>

时间:2015-04-30 18:34:32

标签: c# windows

我正在一个项目中工作,我需要在.txt文件中读取行并将这些行推送到List。

在我的第一个原型中,在WPF中,我使用这个非常简单的代码来执行此操作:

Item.all.sort_by(&:vote_count).reverse.first(10)

但是,现在我正在使用Windows Phone 8.1版本,我不能这样做。

目前,我的研究来了这段代码,但没有成功:

private static List<string> fileLines = File.ReadAllLines("WordList.txt").ToList();

我对此代码的一些问题是我不知道这是否返回一个List,其中文件的每一行是一个元素,如果我尝试分配一个任务&gt;键入列表我有这个错误:错误2无法隐式转换类型'System.Threading.Tasks.Task&gt;'到'System.Collections.Generic.List'

也许这段代码完全不符合我的需要。同样,我需要的只是在我的打包应用程序中读取.txt文件,并在fileLines List的元素中转换每一行。显然,之后,我需要从方法中访问此List。

2 个答案:

答案 0 :(得分:3)

根据documentation,对ReadLinesAsync的调用将返回IAsyncOperation<IVector>,即当您等待它时,这将返回IVector<string>。对于此类型,文档说明:

  

表示随机访问的元素集合。 .NET:这个   接口在.NET代码中显示为System.Collections.Generic.IList<T>   由于.NET语言投影。在任何情况下Windows运行时   type已经实现了IVector,.NET代码可以使用API   而是IList<T>

所以代码中的这一行应该可以正常工作

IList<string> text = await Windows.Storage.FileIO.ReadLinesAsync(sampleFile);

问题是text的类型为IList<string>,但您的方法的返回类型为List<string>。您无法将IList<string>实例分配给类型List<string>的返回值。

要解决此问题,您可以使用以下两个选项之一:

  1. 将方法的签名更改为

    public static async Task<IList<string>> LoadingLines()

  2. 返回时将方法结果转换为List<string>

    return text.ToList();
  3. 当您使用从方法返回的结果时,您也必须使用await关键字,因此这一行:

    public static List<string> fileLines = LoadingLines();
    

    无效,因为LoadingLines会返回Task<List<string>>。您不能异步加载到静态成员变量。如果您希望这样做(对代码进行最小的更改) 1 您可以执行以下操作:

    删除此行:

    public static List<string> fileLines = LoadingLines();
    

    并将其替换为:

    private readonly static Task<List<string>> loadLinesTask = LoadingLines();
    
    public static async Task<List<string>> GetLinesAsync()
    {
        return await _loadLinesTask.ConfigureAwait(false);
    }
    

    然后,您可以使用其他“异步”方法调用GetLinesAsync()。如果您需要在未标记为async的方法中调用此方法,则无法使用await和(使用MyClass使用这些方法的类)您必须这样做才能获得行列表:

    var lines = MyClass.GetLinesAsync().Result;
    

    1 有更好的方法可以做到这一点,但讨论这个问题超出了这个问题的范围。

答案 1 :(得分:0)

  1. 将文本文件添加到您的项目。右键单击它,选择“属性”,然后将action属性设置为“ embedded resource”。

  2. 按以下方式访问它。资源名称是完全限定名称,表示包含名称空间。 (例如-“ MyCompany.Project.Resouces.fileName.txt”)。

        var list = new List<string>();
        var assembly = Assembly.GetExecutingAssembly();
        var resourceName = "XYZ.ABC.Resources.MyTextFile.txt";
    
        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        using (StreamReader reader = new StreamReader(stream))
        {
            while (!reader.EndOfStream)
            {
                list.Add(reader.ReadLine());
            }
        }
        return list;