从列表中排除一个项目,并在遍历列表时获取所有其他项目

时间:2017-02-08 15:20:27

标签: c# optimization

这是有问题的一行:

var sbData = Items[i].GetSubitemsInRangeData(Items.Where(item => item.Id != Items[i].Id).ToArray());

需要遍历列表,在列表中的每个项目上调用一个方法,当前项目除外,然后一些子项目将对随机项目执行某些操作(当然,除了当前项目)。

我想通过避免重新创建Items.Count列表来优化上面提到的行,因为我经常调用DoStuff()。

我找不到与我的情况有关的任何内容所以我希望有人会回答或者至少将其标记为副本并指出我正确的方向。

public static class Program
{
    public static List<IItem> Items = new List<Items>();

    public static void Main()
    {
        while(true)
        {
            AddAndRemoveToItems();
            DoStuff();
        }   
    }

    public static void DoStuff()
    {
        for (var i = 0; i < Items.Count; i++)
        {
            var sbData = Items[i].GetSubitemsInRangeData(Items.Where(item => item.Id != Items[i].Id).ToArray());

            for (var j = 0; j < sbData.Count; j++)
            {
                DoSomethingWith(sbData[i]);
            }
        }
    }
}

public class SubItem : ISubItem
{
    public bool InRange(IItem item) { /* some logic here*/ };
    public bool SomeCondition() { /* some logic here*/ };
    public void DoSomethingTo(IItem item) { /* some logic here*/ };
}

public class Item : IItem
{
    public List<ISubItem> SubItems = new List<ISubItem>();

    public List<DataType> GetSubitemsInRangeData(List<ItemType> items)
    {
        var sbData = new List<Data>();

        foreach (var subItem in SubItems.Where(sb => sb.SomeCondition()))
        {
            var itemsInRange = items.Where(item => subItem.InRange(item)).ToList();

            if (itemsInRange.Length == 0)
            {
                continue;
            }

            var targetItem = itemsInRange.Shuffle()[0]; // pick a random item from the list

            subItem.DoSomethingTo(targetItem);

            sbData.Add(new Data
            {
                TargetId = targetItem.Id,
                Index = subItem.Index
            });
        }

        return sbData;
    }
}

0 个答案:

没有答案