[英]How can I extract a string out of an object that contains this string?
我創建了一個看起來像這樣的 Yaml:
Directories:
- ./Libraries:
- DLLList.yml
- ./Output:
- None
現在我將 yaml 反序列化為對象列表:
List<object> allDirectoriesList = new List<object>();
List<string> allFileNames = new List<string>();
using (var reader = new StringReader(File.ReadAllText("./FileConfig.yml")))
{
allDirectoriesList = deserializer.Deserialize<dynamic>(reader)["Directories"] as List<Object>;
}
foreach (var directory in allDirectoriesList)
{
var directoryAsDictionary = (Dictionary<object, object>)directory;
List<object> list = directoryAsDictionary.Select(kvp => kvp.Value).ToList();
IEnumerable<string> _fileList = list.Select(i => i.ToString());
List<string> fileList = _fileList.ToList<string>();
for (int i = 0; i < fileList.Count(); i++)
{
var x = (string)list[i];
}
}
directory
是一個字典類型的 object,我在這部分將其轉換為列表:
var directoryAsDictionary = (Dictionary<object, object>)directory;
List<object> list = directoryAsDictionary.Select(kvp => kvp.Value).ToList();
此list
包含 1 個字符串類型的 object,其中存儲了文件名。 但我無法將這些字符串從對象中取出。 如果我將它們轉換或轉換為 ToString(),我總是得到"System.Collections.Generic.List`1[System.Object]"
,但在這種情況下它必須是"DLLList.yml"
假設您使用的是YamlDotNet
:
List<object> allDirectoriesList = new List<object>();
using (var reader = new StringReader(File.ReadAllText("./FileConfig.yml")))
{
allDirectoriesList = new DeserializerBuilder().Build().Deserialize<dynamic>(reader)["Directories"] as List<object>;
}
foreach (var directory in allDirectoriesList)
{
var directoryAsDictionary = (Dictionary<object, object>)directory;
List<object> list = directoryAsDictionary.SelectMany(kvp => (List<object>)kvp.Value).ToList();
List<string> _fileList = list.Select(Convert.ToString).ToList();
foreach(var file in _fileList)
Console.WriteLine($"Item: {file} found in {Convert.ToString(directoryAsDictionary.Keys.First())}");
}
基本上,您試圖將字典值轉換為字符串,但它是一個列表。 通過使用SelectMany
,它可以將所有列表扁平化為一個並使用它。 有一些多余的演員表,我也刪除了。 為了將來參考,嘗試使您的結構盡可能簡單並將它們反序列化為結構/類 - 您會發現這樣更容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.