2017-02-20 82 views
0

喜使用ArrayList和存储简单对象阵列中,我,我的示例代码snipt数组列表与对象类型

ArrayList rows = new ArrayList(); 

     object[] objs = new object[3]; 

     objs[0] = 1; 
     objs[1] = "dilip"; 
     objs[2] = 27; 
     rows.Add(objs); 

     objs = new object[3]; 

     objs[0] = 2; 
     objs[1] = "lucky"; 
     objs[2] = 42; 
     rows.Add(objs); 

     objs = new object[3]; 
     objs[0] = 3; 
     objs[1] = "user"; 
     objs[2] = 46; 
     rows.Add(objs); 
     objs = new object[3]; 
     objs[0] = 4; 
     objs[1] = "testing"; 
     objs[2] = 76; 
     rows.Add(objs); 
     objs = new object[3]; 
     objs[0] = 5; 
     objs[1] = "trying"; 
     objs[2] = 44; 
     rows.Add(objs); 

如何申请ASC或DESC上例如对象 的任何索引排序排序基于名称其中索引1或根据年龄分类索引2 ..

请提供任何建议。 谢谢..

+0

为什么有人会使用非泛型'ArrayList'的非类型'object []'。它使您的代码变得困难,不可读和容易出错,并出现从“InvalidCastExceptions”开始的装箱/取消装箱性能开销的不同问题。改为使用类型化的数组结构。 –

+0

我知道,但其现有的项目和新的木工不能提出设计更改。现有的设计有什么办法?谢谢 – Dilip

+0

@Dilip使用'List '查看答案是否有一个原因,您不能使用它而不是'ArrayList'? – Svek

回答

0

你需要有比较器进行排序您的ArrayList类型。在你的情况下,它会是这个样子:

public class MyComparer : IComparer 
{ 
    int IComparer.Compare(Object x, Object y) 
    { 
     int sortingIndex = 1; 

     var xUnbox = x as object[]; 
     var yUnbox = y as object[]; 

     return ((new CaseInsensitiveComparer()).Compare(yUnbox[sortingIndex], xUnbox[sortingIndex])); 
    } 
} 

有了这个,你现在可以排序您的ArrayList:

var comparer = new MyComparer(); 
rows.Sort(comparer); 

foreach (object[] line in rows) 
{ 
    Console.WriteLine(line[1]); 
} 

这个例子会被索引排序您的ArrayList 1.

虽然我会强烈建议使用强类型的集合,如List<YourType>来代替,因为那样你可以只用Linq命令。

1

大多数LINQ方法将与强类型的IEnumerable<T>接口一起使用。

使用OfType这样rows.OfType<object[]>().OrderBy(x => x[1])

尽管方式方法你接近你的数据结构很快就会使代码难以维护。你最好考虑使用类来反映你的数据。

0

有没有理由不能使用List<object[]>而不是使用ArrayList

例如:

List<object[]> rows = new List<object[]>(); 

object[] objs = new object[3]; 

objs[0] = 1; 
objs[1] = "dilip"; 
objs[2] = 27; 
rows.Add(objs); 

var query = rows.Where(r => (string)r[1] == "dilip"); 

然后,你可以把你所有的各种排序等

var query = rows 
    .OrderBy(r => (int)r[0]) 
    .OrderBy(r => (string)r[1]) 
    .OrderByDescending(r => (int)r[2]);