在将列表写入文本 C# 时遇到问题 [已关闭]

Having issues writing List to Text C# [closed]

提问人:Burhanaddin Mirsadizada 提问时间:11/6/2023 更新时间:11/10/2023 访问量:93

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将有助于其他人回答这个问题。

17天前关闭。

  public class FileService
   {
       IProductRepository _repository = new ProductRepository();
       string path = "....";
       public async Task<string> GetInfoAsync()
       {
           List<Product> products = await _repository.GetAllAsync();
           string? value = default;
           foreach (Product item in products)
               value += item.ToString();

           if (!string.IsNullOrWhiteSpace(value))
               return value;
           else
               return "List is empty!";
       }
       public async Task WriteAsync()
       {
           File.WriteAllText(path, await GetInfoAsync());
       }
   }

此代码有问题。它总是返回 null 并写入“List is empty!”。确实覆盖了 Product 类中的 ToString() 方法。我是初学者,所以不要评判:/

我期望它获取列表并将其写入指定的文本文件。

C# 文件 泛型

评论

0赞 Behtash 11/6/2023
究竟是什么产品,是一类吗?您预计错误在哪里?在哪条线上
3赞 Ralf 11/6/2023
这里最好的办法是学习调试(这是一项基本能力)。如果您尝试调试代码,您的问题应该很容易理解。逐步浏览我们的代码,看看“价值”是如何变化的,产品中的实际内容(例如,它可能是一个空列表)等。
3赞 JonasH 11/6/2023
我强烈推荐阅读 如何调试小程序.最有可能的问题是你的工作没有像你预期的那样。GetAllAsync()
1赞 Rand Random 11/6/2023
so don't judge- 你不能告诉我该怎么做,我以评判初学者为生 - 评委们会密集地调试你的代码......设置断点并查看发生的情况
1赞 JonasH 11/6/2023
你怎么知道它工作正常?显然有些不对劲,你需要弄清楚是什么。典型的方法是“分而治之”,即通过验证你对程序状态的假设,尝试将问题隔离到代码的特定部分。即设置一个断点并检查一切是否符合您的预期。

答:

0赞 AztecCodes 11/6/2023 #1

C# 列表到文本问题

变化:

  • 在开始循环之前检查是否为空。productsnull
  • 使用类进行有效的字符串连接。StringBuilder
  • 为每个产品添加,以确保每个产品的信息从新行开始。AppendLineproduct

重构的代码:

public class FileService {
  IProductRepository _repository = new ProductRepository();

  // Ensure that this is a valid path.
  string path = "....";

  public async Task < string > GetInfoAsync() {
    List < Product > products = await _repository.GetAllAsync();

    if (products == null || products.Count == 0)
      return "List is empty!";

    StringBuilder value = new StringBuilder();
    foreach(Product item in products)
    value.AppendLine(item.ToString());

    return value.ToString();
  }

  public async Task WriteAsync() {
    File.WriteAllText(path, await GetInfoAsync());
  }
}

评论

0赞 Rand Random 11/6/2023
AppendLine更改 OP 想要的(可能)所需输出
0赞 AztecCodes 11/6/2023
@RandRandom 让我们看看。
0赞 Fildor 11/6/2023
不过,我建议坚持使用常见的 C# 代码约定和样式。
0赞 Burhanaddin Mirsadizada 11/6/2023
这没有解决它,我将尝试找到问题。
0赞 Burhanaddin Mirsadizada 11/7/2023 #2
class Product
{
    public string Name { get; set; }
    public string Description { get; set; }
    public override string ToString()
    {
        return $"Name:{Name} Description:{Description}";
    }
}

class Program
{
    public static void Main()
    {
        Product product1 = new Product();
        Product product2 = new Product();
        List<Product> products = new List<Product>();
        Console.WriteLine("Enter name:");
        string name = Console.ReadLine();
        Console.WriteLine("Enter desc:");
        string description = Console.ReadLine();
        product1.Name = name;
        product1.Description = description;
        products.Add(product1);
        product2.Name = "Test";
        product2.Description = "Test";
        products.Add(product2);
        string Get()
        {
            string result = default;
            foreach (Product p in products)
            {
                result += $"{p}\n";
            }
            return result;
        }
//"...." stands for path.
        File.WriteAllText("....",Get());
    }
}

我写了这个,它复制了有问题的类的预期功能。在这种情况下,它按预期工作。

我放弃了这个项目,我将尝试从头开始,更仔细地构建它。