Need help comparing arrays/lists to show items that are missing from one of them
Seems like I'm having a pretty good mental block. For whatever reason I can't get my head wrapped around this. I need to compare the contents of one array, which contains all possible items (in this case, only 10 items). As the player plays the game, they will collect these items and they will be placed in a list. I'd like to compare this list to the "master" array of possible items and produce another list showing what has yet to be collected. My attempt (see my code below) gives me an out of range error. I can see why this would happen, but I can't come up with a way to fix it. Or there may be a much better way to go about it. Any help would be much appreciated :).
// Create a new list of items that the player doesn't have
List<Collectible> itemsMissing = new List<Collectible>();
// Populate the items missing list with everything from collectibles
for (int i = 0; i < collectibles.Length; i++)
{
itemsMissing.Add(collectibles[i]);
}
// Now remove all items that the player already has
for (int i = 0; i < itemsMissing.Count; i++)
{
for (int j = 0; j < itemsCollected.Count; j++)
{
if (itemsMissing[i] == itemsCollected[j])
{
itemsMissing.Remove(itemsCollected[j]);
}
}
}
When removing from a list, go through it backwards. That way the list only gets messed up behind you.
But as $$anonymous$$isihotta notes, lots of ways to use built-ins. Your last part could be a single loop through itemCollected using Contains (or IndexOf<0? I forget). The com sci way is: sort both lists, don't make "items$$anonymous$$issing" yet. Compare both in one loop (with an idea for each), and add anything in the first but not the second to items$$anonymous$$issing.
"compare two lists C#" might give also some fun ideas.
Answer by Kishotta · Apr 09, 2019 at 09:18 PM
You can do this with Linq very easily.
itemsMissing = collectables.Except (itemsCollected);
Just be sure to using System.Linq;
Answer by Tsaras · Apr 09, 2019 at 09:27 PM
You can make your code pretty smaller by using List.Contains method.
// Create a new list of items that the player doesn't have
List<Collectible> itemsMissing = new List<Collectible>();
for (int i = 0; i < collectibles.Length; i++)
{
if (!itemsCollected.Contains(collectibles[i])
itemsMissing.Add(collectibles[i]);
}
Although, depending on the implementation of your Collectible class you may need to override the Equals method. Check this link.
Your answer
Follow this Question
Related Questions
compare string to string array[] 2 Answers
For Loop looping out of Loop Condition 1 Answer
How can I save this objects ? 0 Answers
Array problem, I'm novice 1 Answer