C# 从源数组中选择给定的索引范围

C# 从源数组中选择给定的索引范围,c#,.net,arrays,C#,.net,Arrays,我想用数组的索引创建一个数组。假设我有这样一个数组: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 我从查询中得到的结果如下所示: 这意味着位置1、3、4 LengthUnit=2和7已经被占用。因此,现在的阵列看起来像: | T | 2 | T | T | 5 | 6 | T | 8 | 9 | 10 | 式中,T代表被取 如何使用查询结果创建两个整数数组,如下所示: int[] taken = { 1, 3, 4, 7 }; int[] notT

我想用数组的索引创建一个数组。假设我有这样一个数组:

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
我从查询中得到的结果如下所示:

这意味着位置1、3、4 LengthUnit=2和7已经被占用。因此,现在的阵列看起来像:

| T | 2 | T | T | 5 | 6 | T | 8 | 9 | 10 |
式中,T代表被取

如何使用查询结果创建两个整数数组,如下所示:

int[] taken = { 1, 3, 4, 7 };
int[] notTaken = { 2, 5, 6, 8, 9, 10 };
使用Enumerable.Range创建所需项的集合。然后使用Except来获取其他

List<int> values = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

List<Tuple<int, int>> ranges = new List<Tuple<int, int>>
{
    new Tuple<int, int>(1,1),
    new Tuple<int, int>(3,2),
    new Tuple<int, int>(7,1),
};

var t = ranges.SelectMany(range => Enumerable.Range(range.Item1, range.Item2)).ToList();

// Here I decide to use Intersect instead of just having t for the case 
// where you requested a range that doesn't exist
var taken = values.Intersect(t).ToArray();
var notTaken = values.Except(taken).ToList();
使用Enumerable.Range创建所需项的集合。然后使用Except来获取其他

List<int> values = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

List<Tuple<int, int>> ranges = new List<Tuple<int, int>>
{
    new Tuple<int, int>(1,1),
    new Tuple<int, int>(3,2),
    new Tuple<int, int>(7,1),
};

var t = ranges.SelectMany(range => Enumerable.Range(range.Item1, range.Item2)).ToList();

// Here I decide to use Intersect instead of just having t for the case 
// where you requested a range that doesn't exist
var taken = values.Intersect(t).ToArray();
var notTaken = values.Except(taken).ToList();
可枚举。在这种情况下,范围证明很有用:

Dictionary<int, int> startAndLength = new Dictionary<int, int>()
                                      { { 1, 1 }, { 3, 2 }, { 7, 1 } };

int[] taken = startAndLength
              .SelectMany(kvp => Enumerable.Range(kvp.Key, kvp.Value)).ToArray();

int[] notTaken = Enumerable.Range(0, 10).Except(taken).ToArray();
开始创建一组起点和长度,然后使用Enumerable.Range确定所取项目。然后再次使用Enumerable.Range确定未获取的项目。

Enumerable.Range证明在这种情况下很有用:

Dictionary<int, int> startAndLength = new Dictionary<int, int>()
                                      { { 1, 1 }, { 3, 2 }, { 7, 1 } };

int[] taken = startAndLength
              .SelectMany(kvp => Enumerable.Range(kvp.Key, kvp.Value)).ToArray();

int[] notTaken = Enumerable.Range(0, 10).Except(taken).ToArray();

开始创建一组起点和长度,然后使用Enumerable.Range确定所取项目。然后再次使用Enumerable.Range来确定未获取的项目。

一点Linq将为您带来很大的帮助:

public class QueryResult
{
    public int StartUnit { get; set; }
    public int LengthUnit { get; set; }
}

var input = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var queryResult = new QueryResult[]
{
    new QueryResult { StartUnit = 1, LengthUnit = 1 },
    new QueryResult { StartUnit = 3, LengthUnit = 2 },
    new QueryResult { StartUnit = 7, LengthUnit = 1 },
};

var taken = new List<int>();

taken.AddRange(queryResult.SelectMany(q => (input.Skip(q.StartUnit - 1).Take(q.LengthUnit))));

Console.WriteLine("Taken: {0}", string.Join(",", taken));

var notTaken = input.Except(taken);

Console.WriteLine("Not taken: {0}", string.Join(",", notTaken));
并生成要从中排除的除外项的完整范围:

var notTaken = Enumerable.Range(1, 10).Except(taken);

当然,如果您希望输出实际上是数组,请在此处或那里调用ToArray。

一点Linq将为您带来很大的帮助:

public class QueryResult
{
    public int StartUnit { get; set; }
    public int LengthUnit { get; set; }
}

var input = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var queryResult = new QueryResult[]
{
    new QueryResult { StartUnit = 1, LengthUnit = 1 },
    new QueryResult { StartUnit = 3, LengthUnit = 2 },
    new QueryResult { StartUnit = 7, LengthUnit = 1 },
};

var taken = new List<int>();

taken.AddRange(queryResult.SelectMany(q => (input.Skip(q.StartUnit - 1).Take(q.LengthUnit))));

Console.WriteLine("Taken: {0}", string.Join(",", taken));

var notTaken = input.Except(taken);

Console.WriteLine("Not taken: {0}", string.Join(",", notTaken));
并生成要从中排除的除外项的完整范围:

var notTaken = Enumerable.Range(1, 10).Except(taken);

当然,如果您希望输出实际上是数组,可以在此处或那里调用ToArray。

循环查询结果并跳过并获取适当的索引?你试过什么?开始单元有1,3,7,怎么取4?@yogi问题中没有解释这一点,但考虑到3的长度单位是2,我想OP想要从3开始取2条记录。@CodeCaster你是right@yogi2是从起始单位开始的长度单位。那么,3,4是不是要跳过查询结果,跳过并获取适当的索引?你试过什么?开始单元有1,3,7,怎么取4?@yogi问题中没有解释这一点,但考虑到3的长度单位是2,我想OP想要从3开始取2条记录。@CodeCaster你是right@yogi2是从起始单位开始的长度单位。那么,3,4是taken@Tim但是它假设输入总是连续的,但是它假设输入总是连续的。