从数组中删除屏蔽条目

时间:2014-05-30 17:29:01

标签: c# algorithm

如果输入 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 会导致问题无需考虑。我们假设这些都得到了处理。

如何提高代码效率? 如何使语法更紧凑和可掌握?

2 个答案:

答案 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;
    }
}