如果输入 null ,则任务是保持一组对象不变,否则,删除输入指定位置上的元素。我已经开始工作,但我对代码质量非常不满意。
List<Stuff> stuff = new List<Stuff>{ new Stuff(1), new Stuff(2), new Stuff(3) };
String input = "5";
if(input == null)
return stuff;
int mask = Int32.Parse(input);
for (int i = stuff.Count - 1; i >= 0; i--)
if ((mask & (int)Math.Pow(2, i)) == 0)
stuff.RemoveAt(i);
return stuff;
实际获取输入以及例如 String.Empty 会导致问题无需考虑。我们假设这些都得到了处理。
如何提高代码效率? 如何使语法更紧凑和可掌握?
答案 0 :(得分:3)
您可以将Linq与以下语句一起使用,而不是向后运行的循环。
stuff = stuff.Where( (iStuff, idx) => (mask & (int)Math.Pow(2, idx)) != 0 );
甚至更酷,使用按位狗屎。
stuff = stuff.Where((_, index) => (mask >> index & 1) == 1);
它使用Where
的重载,可以访问序列中的位置,如文档here所示。对于类似的任务,还有一个Select
的重载,它提供了对索引的访问,如文档here所述。
答案 1 :(得分:0)
未经测试,但您可以创建一个迭代集合和过滤器的扩展方法,返回匹配的元素。反复按位移位掩码并检查第0位似乎是最容易遵循的 - 至少对我来说。
static IEnumerable<T> TakeMaskedItemsByIndex(this IEnumerable<T> collection, ulong mask)
{
foreach (T item in collection)
{
if((mask & 1) == 1)
yield return item;
mask = mask >> 1;
}
}