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

C# 从列表中排除一项,并在遍历列表时获取所有其他项,c#,optimization,C#,Optimization,这是有问题的一行: var sbData = Items[i].GetSubitemsInRangeData(Items.Where(item => item.Id != Items[i].Id).ToArray()); 在需要遍历列表时,对列表中的每个项(当前项除外)调用一个方法,然后一些子项将对随机项(当然,当前项除外)执行某些操作 我希望通过避免再次创建Items.Count列表来优化上述行,因为我经常调用DoStuff() 我找不到任何与我的处境有关的东西,所以我希望有人能回答,

这是有问题的一行:

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;
    }
}
公共静态类程序
{
公共静态列表项=新列表();
公共静态void Main()
{
while(true)
{
添加和移动项目();
DoStuff();
}   
}
公共静态void DoStuff()
{
对于(变量i=0;iitem.Id!=Items[i].Id).ToArray());
对于(var j=0;jsb.SomeCondition())
{
var itemsInRange=items.Where(item=>subItem.InRange(item)).ToList();
if(itemsInRange.Length==0)
{
继续;
}
var targetItem=itemsInRange.Shuffle()[0];//从列表中选择一个随机项
分项.DoSomethingTo(targetItem);
sbData.Add(新数据)
{
TargetId=targetItem.Id,
索引=子项。索引
});
}
返回数据;
}
}

为什么不创建一次(所有项目),然后一直使用它?在子项计算中添加一个“if”,这样当它等于当前选定项时,它就不会使用“i”。项初始化一次,我在DoStuff()调用之间添加和删除项。GetSubitemsInRangeData需要除Items[i]之外的项(子项中的var subItem.Where(sb=>sb.SomeCondition()&&i!=j))谢谢您的回答。我修改了原来的帖子,以确保每个人都了解谁是世卫组织的成员。你的解决方案仍然适用吗?如果我理解正确的话,这可能是像汽车反弹一样的东西,它们不会自动反弹?