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))谢谢您的回答。我修改了原来的帖子,以确保每个人都了解谁是世卫组织的成员。你的解决方案仍然适用吗?如果我理解正确的话,这可能是像汽车反弹一样的东西,它们不会自动反弹?