我不确定我寻找的是否确实存在,所以也许你们可以提供帮助。
我有以下数据:
Apples|3211|12
Markers|221|9
Turtle|1023123123|22
第一列始终是字符串,第二列和第三列是整数。但是,我想要做的是能够将这些作为字符串或整数引用,然后能够通过第三列asc进行排序。有什么想法吗?
MyTable [i] .Column [i]之类的东西,在这种情况下,MyTable [1] .Column [2]会产生12作为int(因为它是有序的)。
答案 0 :(得分:5)
如果您想要类型安全,则需要创建一个包含每条记录的类:
class Record
{
string Name { get; set; }
int SomeValue { get; set; }
int OrderNr { get; set; }
}
然后将它们存储在通用列表<>中,然后您可以根据需要订购它们:
List<Record> items = // read them into a list of items;
List<Record> orderedList = items.OrderBy(i => i.OrderNr).ToList();
<强>更新强>
自从请求以来我定制了JustinNiessner的答案以适合我的例子:
string data = // your data as string
List<Record> records = data
.Split('|')
.Select(item => new Record
{
Name = item[0],
SomeValue = int.Parse(item[1]),
OrderNr = int.Parse(item[2])
}).ToList();
List<Record> orderedRecords = records.OrderBy(r => r.OrderNr).ToList();
这可以通过使用var
进行优化,而不是在列表中执行ToList()
,但这样做是为了让您更轻松地更好地理解概念。
答案 1 :(得分:2)
假设您的数据存储在某种IEnumerable<string>
类型中,您可以尝试以下内容:
var sortedObjs = stringRows
.Split('|')
.Select(r => new
{
ColA = r[0],
ColB = int.Parse(r[1]),
ColC = int.Parse(r[2])
})
.OrderBy(r => r.ColC).ToList();
var specificVal = sortedObjs[1].ColC;
答案 2 :(得分:1)
这说明您的设计中存在更大的问题。使用集合来保存一堆不同的类型,意图将它们组织成某种结构,这样很脆弱,容易出错,而且完全没必要。
相反,请创建自己的类型以组织此信息。
class MyType
{
public string Name { get; set; }
public int Whatever { get; set; }
public int AnotherProp { get; set; }
}
现在,您的数据在逻辑上分组在一个漂亮,紧凑,类型安全的包中。
答案 3 :(得分:0)
您的原始帖子未指定内容是什么,但由于您要通过Descripton(?)或Id(?)选择它们,然后按第三列对它们进行排序,这样的内容可能适用于你?
//Code tested in LinqPad
void Main()
{
//Apples|3211|12
//Markers|221|9
//Turtle|1023123123|22
//Create a list of items
var items = new List<Item>
{
new Item { Description = "Apple", Id = 3211, Sequence = 12 },
new Item { Description = "Markers", Id = 221, Sequence = 9 },
new Item { Description = "Turtle", Id = 1023123123, Sequence = 22 }
};
//Get sorted list of Apple by Description
var sortedByDescription = items.Where(i => i.Description == "Apple").OrderBy(i => i.Sequence);
//Get sorted list of Turtle by Id
var sortedById = items.Where(i => i.Id == 221).OrderBy(i => i.Sequence);
}
public class Item
{
public string Description { get; set; }
public int Id { get; set; }
public int Sequence { get; set; }
}