嗨,我有点被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];
}
}
答案 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));
请注意,这些段不存储数据的副本,而是引用主数组中的数据。