簡體   English   中英

如何使用從 .txt 文件中讀取的對象填充我的列表? (C# UWP)

[英]How can I populate back my list with objects read from .txt file? (C# UWP)

我不熟悉 UWP 應用程序中的 FileIO,但我設法使用我在此站點上找到的方法將我的列表保存到 .txt 文件。 問題是,我不知道如何讀取文件並用這些對象填充我的列表。 我的對象類如下所示:

public class Item : ObservableObjectBase
    {
        private string id;
        public string ID
        {
            get => id;
            set => SetAndNotifyIfChanged(ref id, value);
        }

        private string description;
        public string Description
        {
            get => description;
            set => SetAndNotifyIfChanged(ref description, value);
        }

        private int quantity;
        public int Quantity
        {
            get => quantity;
            set => SetAndNotifyIfChanged(ref quantity, value);
        }

        private Category category;
        public Category Category
        {
            get => category;
            set => SetAndNotifyIfChanged(ref this.category, value);
        }

        private int price;
        public int Price
        {
            get => price;
            set => SetAndNotifyIfChanged(ref price, value);
        }

其中類別是:

public class Category : ObservableObjectBase
    {
        private string name;
        public string Name
        {
            get => name;
            set => SetAndNotifyIfChanged(ref name, value);
        }

        private bool isSensitive;
        public bool IsSensitive
        {
            get => isSensitive;
            set => SetAndNotifyIfChanged(ref isSensitive, value);
        }

我設法將這些Item對象保存到這樣的文件中:

private async void Button_Click_2(object sender, RoutedEventArgs e)
        {
            var sortedLines = itemlist.OrderBy(i => i.ID)
                          .Select(i => $"{i.ID}*{i.Category.ToString()}*{i.Description}*{i.Price.ToString()}*{i.Quantity.ToString()}");

            StorageFolder folder = ApplicationData.Current.LocalFolder;
            StorageFile file = await folder.CreateFileAsync("data.txt", CreationCollisionOption.ReplaceExisting);

            if (file != null)
            {
                await FileIO.WriteLinesAsync(file, sortedLines);
            }
        }

在這里,我將 Category 保存為字符串,其覆蓋的ToString方法如下所示:

private string IsSensitiveAsString => IsSensitive ? "[S]" : "";
public override string ToString() => $"{Name} {IsSensitiveAsString}";

在文本文件中,我用 * 分隔了屬性,因為描述可能很長,並且可以包含逗號、空格等等。 添加 2 個項目后,這就是它們在文本文件中的顯示方式:

ABC123*SUV *Item1's description. Contains spaces! *3000*40
DEF456*OldTimer [S]*Item2's description. This one can be really long too!!*5400*82

考慮到它是一個 UWP 應用程序,我完全迷失了我可以執行此操作的方法,我可以執行單個字符串,但我不知道如何將我的 Category 轉換回其 Name 和 IsSensitive 屬性。 此外,如果項目的描述太長,文本文件中可能會有多行,我不確定這是否會導致一些問題。 任何幫助將不勝感激!

如何使用從 .txt 文件中讀取的對象填充我的列表? (C# UWP)

正如@Michał Turczyn 所說,更好的方法是將列表序列化為 JSON 字符串,並使用 JSON 反序列化檢索列表對象。

例如。

連載

 var items = new ObservableCollection<string>() { "hee", "ss", "dasde" };
 string output = JsonConvert.SerializeObject(items);

反序列化

 string json = await Windows.Storage.FileIO.ReadTextAsync(file);
 var items = JsonConvert.DeserializeObject<ObservableCollection<string>>(json);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM