C#寻找可处理int和字符串的可排序数组

时间:2012-03-14 19:10:28

标签: c#

我不确定我寻找的是否确实存在,所以也许你们可以提供帮助。

我有以下数据:

Apples|3211|12
Markers|221|9
Turtle|1023123123|22

第一列始终是字符串,第二列和第三列是整数。但是,我想要做的是能够将这些作为字符串或整数引用,然后能够通过第三列asc进行排序。有什么想法吗?

MyTable [i] .Column [i]之类的东西,在这种情况下,MyTable [1] .Column [2]会产生12作为int(因为它是有序的)。

4 个答案:

答案 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; }
}