一點點的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));
使用SelectMany()
,Skip()
和Take()
,您可以選擇您要包括的範圍。使用Except()
即可獲取未拍下的物品。
請注意,這會執行可怕的,因爲它迭代收集方式太多次。它還假定StartUnit
實際上表示輸入集合中的一個(索引+ 1),而不是一個值。
如果你實際上並不想看看輸入數組和值總是連續的(輸入即無孔),可以使用Enumerable.Range()
生成請求範圍:
taken.AddRange(queryResult.SelectMany(q => Enumerable.Range(q.StartUnit, q.LengthUnit)));
並且生成全範圍爲Except()
,以排除:
var notTaken = Enumerable.Range(1, 10).Except(taken);
當然,如果你想輸出實際上是數組,做一個呼叫ToArray()
在這裏和那裏。
循環查詢結果並Skip()和Take()相應的索引?你有什麼嘗試? – CodeCaster
開始單位有'1,3,7'howz'4'被拍攝? – yogi
@ yogi這個問題沒有解釋,但是給定3的長度單位是2,我假設OP想要從3開始取2條記錄。 – CodeCaster