【问题标题】:C# Split text array into sub arrayC#将文本数组拆分为子数组
【发布时间】:2015-05-28 05:14:03
【问题描述】:

我似乎在网上找不到很多东西:(

对于我的课程,我必须从grocery.txt 文件中获取文本并输出发票。

文本文件如下所示:

regular,bread,2.00,2
regular,milk,2.00,3
regular,cereal,4.00,1
fresh,rump steak,11.99,0.8
fresh,apple,4.60,1.00
fresh,cucumber,2.20,0.936
regular,cream,2.20,1
regular,mustard,3.30,1
fresh,carrots,1.79,1.5
regular,tomato sauce,2.95,1
regular,salt,2.80,1
fresh,bananas,4.00,1.2

目前我使用这种方法来获取文本:

    string[] groceryItemsArray = System.IO.File.ReadAllLines(@"C:\C\groceries.txt");

我得到的是一个存储整行的数组(例如“新鲜,香蕉,4.00,1.2”)。 我不知道如何将数组拆分为子数组,甚至不知道最好的方法是什么。不幸的是,对于我们所学的少量材料和我们所拥有的时间来说,这个课程任务太先进了。我已经花了大约 6 个小时观看视频,并且在学习高级内容方面还没有走太远。

这就是我想要完成的。

A.名为 grocerrItem 的类。此类具有以下属性: 名称和价格 这个类必须有 2 个构造函数

A.它的子类是购买的物品。 此类具有整数属性“数量” 它的方法之一是 findCost,计算项目的成本,包括 10% 的 GST。 这个公式是价格 * 数量 * 1.1

C.此类 (purchasedItem) 的子类,freshItem 有 一个属性权重,一个double类型。 这里的 findCost 方法,使用公式:wieght * price,因为它不受 GST 约束。

Groceries.txt 包含如下信息:

类型(普通或新鲜)、名称、价格、数量/重量 - 取决于是普通还是新鲜。

** 发票应表示为杂货项目的集合(父类)。这可以使用任何容器结构来完成,即数组、列表或集合。然后你将使用迭代

【问题讨论】:

  • CSV File Imports in .Net 的可能重复项
  • 只是为了确认一下,您是否尝试将其拆分为单独的字符串?或者您是否尝试为每一行创建一个“子数组”? “子数组”是什么意思?有很多方法可以轻松完成其中任何一个,但我们需要更多信息。
  • 查找string.Split()
  • 你能添加你期望的输出吗?
  • 抱歉,已将结果添加到问题中。

标签: c# arrays string split


【解决方案1】:

你可以使用 String.Split 来返回你想要的子数组。

public static void Main()
{
    string[] groceryItemsArray = System.IO.File.ReadAllLines(@"C:\C\groceries.txt");

    // now split each line content with comma. It'll return you an array (sub-array)
    foreach (var line in groceryItemsArray)
    {
        string[] itemsInLine = line.Split(',');

       // Do whatevery you want to do with this.
       // e.g. for 1st line itemsInLine array will contains 4 items 
       // "regular","bread","2.00", "2"
    }
}

【讨论】:

  • 有趣,有道理。但是当我尝试写出 itemsInLine 时,我收到一个错误“名称 itemsInLine 在此上下文中不存在”。你能解释一下这是如何工作的吗?
  • @RiCHiE 你在哪里访问那个itemsInLine 变量并告诉我,你到底想做什么,这样我就可以解释如何实现它
  • 没关系,对不起,我使用了错误的语法。我正在使用 Console.Write(groceryItemsArray[0][1]);这似乎是由字母分隔,而不是由,
【解决方案2】:

您可以使用此代码(我不确定您到底在寻找什么):

/// It's return all text as a single list
var groceryItemsArray = System.IO.File.ReadAllLines(@"C:\C\groceries.txt")
      .SelectMany(x => x.Split(new char[]{','} , StringSplitOptions.RemoveEmptyEntries)).ToList() ;

或者如果想作为子列表返回可以使用这个代码:

 var groceryItemsArray = System.IO.File.ReadAllLines(@"C:\C\groceries.txt").Select(x => 
           new { Child = x.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) }).ToList();

【讨论】:

  • 希望按每行中的每个项目拆分数组,但不要将每行作为一个项目松散。
  • Lambdas 对他来说可能有点太高级了。他需要了解它们是什么、它们做什么以及应该如何使用它们……而不仅仅是给出代码。只是一个想法。
【解决方案3】:

我真的不明白你想输出什么,但这里是我对你的问题的一些基本理解:

代码未测试

我创建了一个父类:

class GroceryItem 
{
    public string ItemName {get;set;}
    public decimal Price {get;set;}

    public GroceryItem() { }
}

并创建一个子类:

class PurchasedItem : GroceryItem
{
    public int Quantity { get;set; }
    public decimal Cost { get;set; }

    public PurchasedItem(string[] item)
    {
        ItemName = item[1];
        Price = decimal.Parse(item[2]);
        Quantity = int.Parse(item[3]);
        FindCost();
    }

    private void FindCost()
    {
        Cost = Price * Quantity * 1.1;
    }
}

使用您的输入来获取所有的groceryItems,您可以使用foreach 循环进行迭代并收集购买的Items 的列表。

Main()
{
    string[] groceryItems = System.IO.File.ReadAllLines(@"C:\C\groceries.txt");

    var purchasedItems = new List<PurchasedItem>();
    foreach (var item in groceryItems)
    {
        string[] line = item.Split(',');
        purchasedItems.Add(new PurchasedItem(line));
    }
}

如果您不了解编程的基本概念,最好从link 开始。

【讨论】:

  • 是的,我猜有点迷路了,看了很多基础资料。
  • 如果您不理解我发布的示例。我建议您从我在答案中包含的链接开始,祝您好运! :)
  • 是的,我正在查看,我不明白为什么将数组转换为具有类似于 Sachin 发布的 4 个拆分值的多维数组如此复杂。可能我对其他语言的想法和C#完全不同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多