Say I have an arbitrary list [2, 5, 6, 2, 2, 4]
Now given a list, let call it list A [1,2,3,4,5,6,0].
List A contain all the number in the arbitrary list in a certain order. Now let arrange the first list based on the order of List A. Each new order will become a new list. So the outcome should be
[2,5,6]
[2]
[2,4]
Another example if the list is splitted based on the order of list B [4,5,6,0,1,2,3]
then the outcome should be
[2]
[5,6,2]
[2]
[4] <-- the different is that now the (ordered?) list change, the 4 is now belong on the next row.
I want to do this in LINQ or a functional way. I have an iterative solution that I posted in my original question please don't read it until you have answered or attempted to answer this question as I don't want to introduce iterative bias thinking into the answer...
Split a list or ordered dates into weeks using linq
Or see below for the iterative answer
var orders = new List<int> { 4, 5, 6, 0, 1, 2, 3 };
var nums = new List<int> {2, 5, 6, 2, 2, 4};
var queue = new Queue<int>(nums);
var results = new List<List<int>>();
while (queue.Count > 0)
{
var subLists = new List<int>();
foreach (var order in orders)
{
if(order == queue.Peek())
subLists.Add(queue.Dequeue());
if (queue.Count == 0)
break;
}
results.Add(subLists);
}
答案 0 :(得分:1)
我会通过遍历您希望一次拆分一个元素的列表来完成此操作。
对于每个元素,在列表中找到定义拆分顺序的索引。将其与前一项的索引进行比较,如果它更大,则将其添加到临时列表中。否则,将临时列表添加到结果列表,并将临时列表设置为仅包含此项目的新列表。
继续以这种方式循环,直到获得<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
<span>
<a href="#">link</a>
</span>
</div>
<div>
<span>
<span title="title 1">Some text written here</span>
</span>
</div>
<div>
<span>
<span title="title 2">Some other text written here</span>
</span>
</div>
<div>
<span>
<a href="#">some link</a>
</span>
</div>
结果。
代码可能更容易理解:
List<List<int>>
答案 1 :(得分:0)
使用for循环非常简单:
List<int> orderList = new List<int>(){ 1, 2, 3, 4, 5, 6, 0 };
List<int> input = new List<int>(){ 2, 5, 6, 2, 2, 4 };
List<List<int>> output = new List<List<int>>();
List<int> temp = null;
for (int i = 0; i < input.Count(); i++)
{
if (i == 0)
{
temp = new List<int>();
output.Add(temp);
temp.Add(input[i]);
}
else
{
if (orderList.IndexOf(input[i]) > orderList.IndexOf(input[i - 1]))
{
temp.Add(input[i]);
}
else
{
temp = new List<int>();
output.Add(temp);
temp.Add(input[i]);
}
}
}