http://www.codewars.com/kata/smallest-unused-id
Description:
Hey awesome programmer!
You‘ve got much data to manage and of course you use zero-based and non-negative ID‘s to make each data item unique!
Therefore you need a method, which returns the smallest unused ID for your next new data item...
Go on and code some pure awesomeness!
自己写了一段超级烂的
Console.WriteLine("Length = {0}", ids.Length); ids = ids.OrderBy(x => x).ToArray(); foreach (var number in ids) { Console.Write("{0} ", number); } Console.WriteLine(); int count = ids.Count(); int result = ids.Min() - 1; if (result != -1) { return 0; } bool loopAllNumber = true; for (int i = 0; i < count; i++) { result++; if (result != ids[i]) { loopAllNumber = false; break; } } Console.WriteLine("after for loop,result = {0}", result); if (loopAllNumber) { result++; } return result;
其他人写的,使用了Linq的Except
var max=ids.Max(); var excepts= Enumerable.Range(0, max).Except(ids); return excepts.Count() == 0 ? max + 1 : excepts.Min();
//
// 摘要:
// 通过使用默认的相等比较器对值进行比较生成两个序列的差集。
//
// 参数:
// first:
// 一个 System.Collections.Generic.IEnumerable<T>,将返回其不在 second 中的元素。
//
// second:
// 一个 System.Collections.Generic.IEnumerable<T>,如果它的元素也出现在第一个序列中,则将导致从返回的序列中移除这些元素。
//
// 类型参数:
// TSource:
// 输入序列中的元素的类型。
//
// 返回结果:
// 包含两个序列元素的差集的序列。
//
// 异常:
// System.ArgumentNullException:
// first 或 second 为 null。
public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second);