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)
干杯!

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();

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);
? ? }
}
閱讀鏈接以了解如果您有特殊分隔符、標題行或其他任何內容該怎么辦。它是高度可配置的。

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;
}
希望這可以幫助。
- 4 回答
- 0 關注
- 249 瀏覽
添加回答
舉報