我正在一个项目中工作,我需要在.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。
答案 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>
的返回值。
要解决此问题,您可以使用以下两个选项之一:
将方法的签名更改为
public static async Task<IList<string>> LoadingLines()
返回时将方法结果转换为List<string>
:
return text.ToList();
当您使用从方法返回的结果时,您也必须使用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)
将文本文件添加到您的项目。右键单击它,选择“属性”,然后将action属性设置为“ embedded resource”。
按以下方式访问它。资源名称是完全限定名称,表示包含名称空间。 (例如-“ 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;