【问题标题】:sort string array using LINQ使用 LINQ 对字符串数组进行排序
【发布时间】:2013-09-23 04:17:09
【问题描述】:

我有一个字符串数组声明如下

string[][] data = new string[3][];
string[] name = new string[10];
string[] contact = new string[10];
string[] address = new string[10];

在我填写姓名、地址和联系人的数据后,地址在某些数据中可以是空字符串。之后,我将其分配给字符串数组数据。

data[0] = name;
data[1] = contact;
data[2] = address

如何使用 LINQ 按名称对字符串数组进行排序。我试试 data = data.orderby(y => y[0]).ToArray();

但是这种排序会改变字符串数组的顺序。假设 data[0] 是商店名称,但排序后成为商店地址。
任何人都知道如何对记录进行排序?请帮忙

【问题讨论】:

  • 对于这么简单的事情,这似乎有点复杂。只需创建一个类/结构来保存您的数据并从中创建一个数组。它更容易分类和处理。
  • 使用数据数组列出

标签: c# asp.net linq


【解决方案1】:

您可以使用它对名称数组(存储在data[0])进行排序:

data[0] = data[0].OrderBy(x => x).ToArray();

但是,这将导致存储在其他数组中的数据与名称数组失去任何有意义的相关性(例如,name[3] 很可能与 contact[3] 不匹配)。为了避免这种情况, 我强烈建议使用一个类来存储这些信息:

class MyClass // TODO: come up with a better name
{
    public string Name { get; set; }
    public string Contact { get; set; }
    public string Address { get; set; }
}

要声明数组,请使用:

MyClass[] data = new MyClass[10];
data[0] = new MyClass   // Populate first record
{
    Name = "...",
    Contact = "...",
    Address = "...",
};

并对数组进行排序:

data = data.OrderBy(x => x.Name).ToArray();

或者这个:

Array.Sort(data, (x, y) => x.Name.CompareTo(y.Name));

第二个选项更有效,因为它重新排列元素,并且不需要分配新数组来存储结果。

或者,使用List<T>

List<MyClass> data = new List<MyClass>(10);
data.Add(new MyClass   // Populate first record
{
    Name = "...",
    Contact = "...",
    Address = "...",
});

并对列表进行排序:

data.Sort((x, y) => x.Name.CompareTo(y.Name));

这将具有与Array.Sort 方法相似的性能,但是,如果您需要能够从列表中动态添加或删除元素,它是一个更好的选择。

【讨论】:

    猜你喜欢
    • 2014-01-05
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2016-07-18
    • 2018-09-22
    相关资源
    最近更新 更多