拆分列表C#

时间:2019-07-06 09:34:38

标签: c# list split

嗨,我有点被C#困住了。我是新来的。 这是我的问题:

我有一个由63个双数组成的列表(我们称其为“大列表”)。

我要使用以下规则将此列表分为6个列表:

第一个列表由大列表的前8个元素组成; 第二个列表从大列表的第9个元素到大列表的(9 + 8 = 17th)元素; 第三个列表从大列表的第18个元素到大列表的(18 + 8 + 1 = 27th)个元素; 第四个列表从大列表的第28个元素到大列表的(28 + 8 + 2 = 38th)个元素; 第五个列表从大列表的第39个元素到大列表的(39 + 8 + 3 = 50th)元素; 第六个列表从大列表的第51个元素到大列表的(51 + 8 + 4 = 63th)元素;

我该怎么办?提前非常感谢您的帮助!

我已经尝试过这种方式,但是它给我一个错误:“无法将[]的索引应用于类型方法组的表达式”

列表列表已拆分=新的List();

        for (int i = 0; i < 6; i++)
        {
            for (int j = 8; j < 8 + i + 1; j++)
            {
                Listsplitted[i] = biglist.Take[j];
            }
        }

4 个答案:

答案 0 :(得分:2)

您可以使用GetRange函数:

List<double> part1= big_list.GetRange(0, 8);//Retrieves 8 items starting with index '0'
List<double> part2= big_list.GetRange(8, 9);//Retrieves 9 items starting with index '8'

或者,如果您不想为各个部分使用不同的名称,则可以创建一个列表列表:

List<List<double>> listoflists = new List<List<double>>();
listoflists.Add(big_list.GetRange(0, 8));//Retrieves 8 items starting with index '0'
listoflists.Add(big_list.GetRange(8, 9));//Retrieves 9 items starting with index '8'            
for(int i=0; i<listoflists.Count;i++){
    for(int j=0; j<listoflists[i].Count; j++){
        Console.Write(listoflists[i][j] + "  ");
    }
    Console.WriteLine();
}

答案 1 :(得分:1)

使用IEnumerable扩展“跳过并获取”是一种非常简单的方法

List<double> first = bigList.Take(8).ToList();
List<double> second = bigList.Skip(8).Take(8).ToList();
List<double> third = bigList.Skip(16).Take(9).ToList();
List<double> fourth = bigList.Skip(25).Take(10).ToList();
List<double> fifth = bigList.Skip(35).Take(11).ToList();

// The last one is without Take to get every remaining element
List<double> sixth = bigList.Skip(46).ToList();

当然,您应该检查索引是否符合您的要求。这些索引不会跳过bigList

中的任何元素

您可以通过以下方法使这种方法更通用

void Main()
{
    var bigList = GetYourBigList();

    List<Tuple<int, int>> positions = new List<Tuple<int, int>>
    {
        new Tuple<int, int>(0,8),
        new Tuple<int, int>(8,8),
        new Tuple<int, int>(16,9),
        new Tuple<int, int>(25,10),
        new Tuple<int, int>(35,11),
        new Tuple<int, int>(46,13)
    };

    List<List<int>> result = SplitTheList(bigList, positions);

    foreach (var list in result)
    {
        foreach (var temp in list)
            Console.WriteLine(temp);
        Console.WriteLine("--------------------");
    }
 }

 List<List<int>> SplitTheList(List<int> r, List<Tuple<int, int>> positions)
 {
    List<List<int>> result = new List<List<int>>();
    foreach(var x in positions)
       result.Add(r.Skip(x.Item1).Take(x.Item2).ToList());
    return result;

 }

答案 2 :(得分:0)

如果您坚持要对一个语句执行一次操作,则可以使用以下代码

#include <type_traits>
#include <iostream>

struct passepartout
 {
   template <typename T>
   operator T & ();

   template <typename T>
   operator T && ();
 };

template <typename F,
   std::enable_if_t<
           std::is_invocable_v<F, passepartout &>
      && ! std::is_invocable_v<F, passepartout &, passepartout &>, bool>
         = true>
void higherOrderFunc (F)
 { std::cout << "-- one parameter callable" << std::endl; }

template <typename F,
   std::enable_if_t<
      std::is_invocable_v<F, passepartout &, passepartout &>, bool> = true>
void higherOrderFunc (F)
 { std::cout << "-- two parameter callable" << std::endl; }

int main ()
 {
   auto l1a = [](auto &&){};
   auto l1b = [](int &){};
   auto l2a = [](auto &, int &&){};
   auto l2b = [](auto, int const &){};
   auto l2c = [](auto &&, auto const &){};
   auto l2d = [](int &&, auto const &, auto && ...){};

   higherOrderFunc(l1a);
   higherOrderFunc(l1b);
   higherOrderFunc(l2a);
   higherOrderFunc(l2b);
   higherOrderFunc(l2c);
   higherOrderFunc(l2c);
   higherOrderFunc(l2d);
 }

答案 3 :(得分:0)

如果可以用数组替换列表,则可以不复制数据。您可以使用ArraySegment(或在新版本的语言中使用Span / Memory)来完成此操作。

var array = Enumerable.Range(0, 63).Select(i => (double)i).ToArray();

var splitted = new List<ArraySegment<double>>();

int offset = 0;
int count = 8;
for (int i = 0; i < 6; i++)
{
    splitted.Add(new ArraySegment<double>(array, offset, count));
    offset += count;
    count++;
}

// see what we have
foreach (var seg in splitted)
    Console.WriteLine(seg.Offset + " " + seg.Count);

// work with segments
var segment = splitted[3];
segment[5] = 555555;

// the main array has also changed
Console.WriteLine(string.Join(" ", array));

请注意,这些段不存储数据的副本,而是引用主数组中的数据。