What is the best way for me to remove an element from List<> A
that is not in List<> B
. On Top of this before I remove the Element
I need to run a function on that Element
(Callback is run when value changed).
For Example
List<Chunk> ActiveChunks = //List Of Active Chunks.
void UpdateChunks()
{
List<Chunk> chunks = //Chunks To Activate
if (ActiveChunks[Element] is not Contained In chunks){
A.Active = False
A.Remove[Element]
}
//After Removing Chunks That do not exist in "chunks" add from chunks to ActiveChunks What is not In already in Chunks
}
What My Code Looks Like
private List<Chunk> ActiveChunks = new List<Chunk>();
private void OnPlayerMoved(Character c)
{
//Current chunk That Player is in
List<Chunk> chunks = new List<Chunk>();
for (int i = -(GameManager.ViewRange - 1); i < GameManager.ViewRange - 1; i++)
{
Chunk chunk = world.ChunkAtWorldPos(c.PosX + i, c.PosY + i);
if (chunk != null)
chunks.Add(chunk);
}
if (ActiveChunks.Count > 0)
{
foreach (Chunk chunk in ActiveChunks)
{
if (chunks.Contains(chunk) == false)
{
chunk.Active = false;
}
}
//This Line From Answer down Below
ActiveChunks.RemoveAll(x => x.Active == false);
foreach (Chunk chunk in chunks)
{
if (ActiveChunks.Contains(chunk) == false)
{
chunk.Active = true;
ActiveChunks.Add(chunk);
}
}
}
else
ActiveChunks.AddRange(chunks);
}
public class Chunk
{
//Position
public readonly int X;
public readonly int Y;
public Tile[,] Tiles;
private bool active = false;
public bool Active{
get{return active;}
set{
if (value == true && value != active)
cbOnActivate?.Invoke(this);
else if (value != active)
cbOnDeactivate?.Invoke(this);
active = value;
}
}
Action<Chunk> cbOnActivate;
Action<Chunk> cbOnDeactivate;
//Constructor
public Chunk(int X, int Y)
{
this.X = X;
this.Y = Y;
}
void RegisterOnActivateCallback(Action<Chunk> callback){
cbOnActivate += callback;
}
void RegisterOnDeactivateCallback(Action<Chunk> callback){
cbOnActivate += callback;
}
}