我有一个这样的清单:
public static List<List<string>> GraphLists = new List<List<string>>();
它包含一些数据:
我想通过SECOND项目对它们进行排序。所以,列表应该是这样的:
{0-0-44,25}
{1-0-41}
{0-1-28}
{1-1-33}
{0-2-37,33}
{1-2-44,33}
如何使用linq执行此操作?
答案 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.Split
和String.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());