亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

c# csv使用第三列對列表進行排序

c# csv使用第三列對列表進行排序

C#
慕工程0101907 2023-08-20 15:20:41
我有一個程序,可以使用 StreamReader 打開 CSV 文件,并根據 CSV 文件中的行數創建一個包含 4 列和行的表。這可以正常工作,就像創建以下輸出一樣:商品代碼、商品描述、當前數量、訂購時A0001,玩具車,4,有A0002,玩具卡車,1,無我將 CSV 文件中的所有數據保存在全局列表中,而不拆分每一行。當我創建表時,我使用“Split(',')”分割行,這在當時需要時工作。但是我不確定如何使用“當前計數”列從最大到最小重新排序整個列表。我已嘗試以下操作,但在 Split(',') 上出現錯誤。public static class Globals{    public static List<string> items = new List<string>();}private void createTableWithOrder(int order){    for (int i = 0; i < Globals.items.; i++)    {         var values = Globals.items[i].Split(',');         if (order == 1)         {              values = Globals.items[i].OrderBy(itemDesc => itemDesc.Split(',')).ToList();         }    }}給出的錯誤如下:“char”不包含“Split”的定義,并且找不到接受“char”類型的第一個參數的擴展方法“Split”(您是否缺少 using 指令或程序集引用?)
查看完整描述

4 回答

?
搖曳的薔薇

TA貢獻1793條經驗 獲得超6個贊

該OrderBy調用正在處理處字符串中的所有字符Globals.items[i]。這就是您看到當前錯誤的原因。為了對整個集合進行排序,需要對整個列表進行排序,例如:


var values = Globals.items.Select(line => line.Split(',')); // Select columns for all rows

var orderedListOfValues = values

    .OrderByDescending(cols => int.TryParse(cols[2].Trim(), out var order) ? order : int.MaxValue); // Sort  by count as an integer

請注意,在上面的示例中,對非數字值(例如標題)進行排序將使用整數的最大值。根據預期的結果,這些結果可以合并回字符串列表中以供演示:


var orderedItems = string.Join(",", orderedListOfValues)

干杯!


查看完整回答
反對 回復 2023-08-20
?
江戶川亂折騰

TA貢獻1851條經驗 獲得超5個贊

您存儲列表的方式不會幫助您生成具有排序功能的表。要解決您的問題,List<string>您應該使用這些模型創建列表來創建模型(IItem 接口和 Item 類)。然后在渲染表格之前,您可以根據您喜歡的任何列對列表進行排序。

List<IItem> items = new List<Item>();
items.Add({itemCode: excelData.itemCode , itemDescription: excelData.itemDescription,itemCount: excelData.itemCount, orderCount:excelData.orderCount});
List<IItem> itemsToCreateTable = items.OrderBy(o=>o.itemCount).ToList();


查看完整回答
反對 回復 2023-08-20
?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

不是直接回答你的問題。但我認為您正在編寫已經可以免費使用的代碼。

我強烈建議您使用nuget 包 CSV Helper。它接受任何文本流、字符串、文本閱讀器等,并將 CSV 文件轉換為您期望類型的 IEnumerable。它可以在有或沒有包含列的標題行的情況下使用

class MyItem

{

? ? public string Code {get; set;}

? ? public string Description {get; set;}

? ? public int Count {get; set;}

? ? public bool OnOrder {get; set;}

}

從 CSV 文件中獲取所有 MyItems:


string myCsvFileName = ...

using (TextReader reader = new StreamReader(myCsvFileName))

{

? ? using (var csv = new CsvReader(reader))

? ? {? ??

? ? ? ? IEnumerable<MyItem> items = reader.GetRecords<MyItem>();


? ? ? ? // you can do any Linq with this:

? ? ? ? var allItems = items.ToList();


? ? ? ? // or if you only need some records:

? ? ? ? var unAvailableItems = items.Where(item => item.Count == 0);

? ? }

}

閱讀鏈接以了解如果您有特殊分隔符、標題行或其他任何內容該怎么辦。它是高度可配置的。


查看完整回答
反對 回復 2023-08-20
?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

目前尚不清楚為什么您不簡單地為文件中的項目創建一個“類”。通過“類別”,您可以以任何您選擇的方式和多種方式對項目進行排序。此外,您想要排序的列(當前計數)似乎是數字。如果您將數字排序為strings,您將得到所有 1 在一起、2 在一起等。例如,它看起來像這樣。

1

10

100

2

20

3

4 …

您將無法使用字符串獲得正確的數字排序順序。因此,您必須按數字而不是字符串對列進行排序才能獲得正確的數字順序。使用類背后的想法是它可以讓您完全控制排序。如果你創建一個List并且Item該類Item實現了該IComparable接口,則可以用一行代碼完成排序......Items.Sort().

下面是上述內容的示例。首先是“類”Item來保存文件中的對象。它僅包含此示例所需的屬性,即CompareTo調用時將使用的方法Items.Sort().

public class Item : IComparable {


  public string Code { get; set; }

  public string Description { get; set; }

  public int Count { get; set; }

  public bool OnOrder { get; set; }


  public Item(string code, string description, int count, bool onOrder) {

    Code = code;

    Description = description;

    Count = count;

    OnOrder = onOrder;

  }


  public int CompareTo(object obj) {

    Item that = (Item)obj;

    return Count.CompareTo(that.Count);

  } 

}

Item下面是使用該類按“當前計數”列對列表進行排序的示例。ADataGridView用于顯示排序列表。


List<Item> Items;


public Form1() {

  InitializeComponent();

}


private void Form1_Load(object sender, EventArgs e) {

  Items = GetData();

  Items.Sort();

  dataGridView1.DataSource = Items;

}


private List<Item> GetData() {

  List<Item> items = new List<Item>();

  Item newItem;

  string line;

  using (StreamReader sr = new StreamReader(@"D:\Test\Test22.csv")) {

    while ((line = sr.ReadLine()) != null) {

      if ((newItem = GetItemFromString(line)) != null) {

        items.Add(newItem);

      }

    }

  }

  return items;

}


private Item GetItemFromString(string itemString) {

  string[] splitArray = itemString.Split(',');

  bool onOrder;

  int count = 0;

  if (splitArray.Length >= 4) {

    int.TryParse(splitArray[2].Trim(), out count);

    if (splitArray[3].Trim() == "Yes")

      onOrder = true;

    else

      onOrder = false;

    return new Item(splitArray[0].Trim(), splitArray[1].Trim(), count, onOrder);

  }

  return null;

}

希望這可以幫助。


查看完整回答
反對 回復 2023-08-20
  • 4 回答
  • 0 關注
  • 249 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號