根据c#中的某些条件对字符串列表进行排序

时间:2015-04-24 08:52:23

标签: c# string linq list sorting

我有一个这样的清单:

public static List<List<string>> GraphLists = new List<List<string>>();

它包含一些数据:

enter image description here

我想通过SECOND项目对它们进行排序。所以,列表应该是这样的:

{0-0-44,25}
{1-0-41}
{0-1-28}
{1-1-33}
{0-2-37,33}
{1-2-44,33}

如何使用linq执行此操作?

4 个答案:

答案 0 :(得分:2)

我认为相当肮脏的黑客,但它应该给你一个想法(我怎么做):

首先创建一个像这样的虚拟类

Resources res = getResources();
mPlanetTitles = res.getStringArray(R.array.planets_array);

然后

class Item
{
    public string first { get; set; }
    public string second { get; set; }
    public string third { get; set; }
}

现在你所要做的就是插回收到的清单。

答案 1 :(得分:1)

由于您需要按照文本中的第二个数字进行排序,因此需要进行拆分 以下是我将如何做到这一点:

//order the outer list based on the middle item
var orderedList = GraphLists.OrderBy(x=>x.First().Split('-')[1]);

替代(更准确)解决方案:

//order the inner lists based on the middle item
GraphLists.ForEach(innerList=>innerList.OrderBy(x=>x.First().Split('-')[1]);

答案 2 :(得分:0)

在问题的评论中已经有很多解释。所以我现在告诉你我的理解:

您有一个列表GraphList,其中每个项目都是字符串列表。一个字符串可能如下所示:

"0-1-44,33"

或一般

"x-y-z"

z是十进制数。

现在,您希望每个“项目列表”(GraphList的元素)按字符串的第二个组件(y)排序。但是,您希望的结果显示您希望先按y然后按x订购,因此我原始回答中提供的解决方案提供了提示:

您可以通过

获得排序的“项目列表”
var subList = GraphList.Items[i].OrderBy(x => 
              {
                  var split = x.Split('-');
                  return split[1].PadLeft(5, '0') + split[0].PadLeft(5, '0');
              });

我使用以下示例代码将GraphList更改为仅包含已排序的子列表:

    static void Main(string[] args)
    {
        List<List<string>> GraphList = new List<List<string>>();
        GraphList.Add(new List<string>() { "0-2-37", "0-0-44", "0-1-28", "1-0-41", "1-2-44", "1-1-33" });
        GraphList.Add(new List<string>() { "2-2-37", "2-0-44", "2-1-28", "3-0-41", "3-2-44", "3-1-33" });
        GraphList.Add(new List<string>() { "4-2-37", "4-0-44", "4-1-28", "5-0-41", "5-2-44", "5-1-33" });

        for (int i = 0; i < GraphList.Count; i++)
        {
            GraphList[i] = GraphList[i].OrderBy(x =>
            {
                var split = x.Split('-');
                return split[1].PadLeft(5, '0') + split[0].PadLeft(5, '0');
            }).ToList();
        }

OLD ANSWER

我会这样做:

var z = l.OrderBy(x => x.First().Substring(2, 1) + x.First().Substring(0, 1));

在第一个l与每个子列表中第一个项目的第一个字符连接后,字符对列表-进行排序。

在您的示例中,列表按

排序
00
01
10
11
20
21

请注意,这假设每个位置只有一位数字。

如果您需要多个数字,则可以对其进行调整,以使用String.SplitString.PadLeft生成固定大小的排序条件。在下面的示例中,我将填充到5位数的宽度,因此按以下顺序排序:

0000000000
0000000001
0000100000
0000100001
0000200000
0000200001

这可以通过以下方式实现:

var z = l.OrderBy(x => 
        {
            var split = x.First().Split('-');
            return split[1].PadLeft(5, '0') + split[0].PadLeft(5, '0');
        });

答案 3 :(得分:-1)

注意每个列表必须包含至少一个元素:

GraphLists.OrderBy(x =&gt; x.First());