如果与另一个数组中的元素相比,从数组中删除重复的元素
Remove elements from Array that are duplicates if compared to elements in another Array
我在许多 SubClassess 中扩展了 SuperClass Tile
,例如 GroundTile
、WallTile
、TrapTile
等。 .
在另一个 Class 中,让我们称之为 Main
,我可以使用一个函数来检索那些 类 的所有实例作为数组。
Main(){
void MyFunctionThatDoesThings(){
GroundTile[] grounds = FindObjectsOfType<GroundTile>();
WallTile[] walls = FindObjectsOfType<WallTile>();
// ... *same code but for other Classes* ...
Tile[] tiles = FindObjectsOfType<Tile>();
// ... etc
}
}
我需要做的是从 tiles
数组中过滤掉其他数组中不存在的元素。
除了循环 tiles
数组,检查当前元素是否等于其他数组中的任何元素,如果不保留它,则删除它,是否有其他方法(或 Linq 方法)来执行此操作?
如果我理解正确的话,这可以作为一个例子:
List<int> l = new List<int> { 1, 2, 4 };
List<int> s = new List<int> { 1, 2, 3 };
var result = s.Where(x => l.Contains(x));
一种方法是使用 LINQ。
假设您有一个 ID 来标识特定对象。
GroundTile[] grounds = FindObjectsOfType<GroundTile>();
WallTile[] walls = FindObjectsOfType<WallTile>();
// ... *same code but for other Classes* ...
Tile[] tiles = FindObjectsOfType<Tile>();
var existingTiles = grounds.Union(walls);
tiles = tiles.Where(t => existingTiles.All(e => e.ID != t.ID)).ToArray();
Tile[] tiles = FindObjectsOfType<Tile>().Except(
Enumerable.Empty<Tile>()
.Concat( grounds )
...
.Concat( walls ) ).ToArray();
如果您已经将每个数组存储在它自己的变量中,如上所示,那么您可以使用 Except()
扩展方法(从 using System.Linq;
获得)过滤掉其他数组.
然后你可以做类似的事情:
GroundTile[] grounds = FindObjectsOfType<GroundTile>();
WallTile[] walls = FindObjectsOfType<WallTile>();
TrapTile[] traps = FindObjectsOfType<TrapTile>();
Tile[] tiles = FindObjectsOfType<Tile>()
.Except(traps)
.Except(walls)
.Except(grounds)
.ToArray();
我在许多 SubClassess 中扩展了 SuperClass Tile
,例如 GroundTile
、WallTile
、TrapTile
等。 .
在另一个 Class 中,让我们称之为 Main
,我可以使用一个函数来检索那些 类 的所有实例作为数组。
Main(){
void MyFunctionThatDoesThings(){
GroundTile[] grounds = FindObjectsOfType<GroundTile>();
WallTile[] walls = FindObjectsOfType<WallTile>();
// ... *same code but for other Classes* ...
Tile[] tiles = FindObjectsOfType<Tile>();
// ... etc
}
}
我需要做的是从 tiles
数组中过滤掉其他数组中不存在的元素。
除了循环 tiles
数组,检查当前元素是否等于其他数组中的任何元素,如果不保留它,则删除它,是否有其他方法(或 Linq 方法)来执行此操作?
如果我理解正确的话,这可以作为一个例子:
List<int> l = new List<int> { 1, 2, 4 };
List<int> s = new List<int> { 1, 2, 3 };
var result = s.Where(x => l.Contains(x));
一种方法是使用 LINQ。 假设您有一个 ID 来标识特定对象。
GroundTile[] grounds = FindObjectsOfType<GroundTile>();
WallTile[] walls = FindObjectsOfType<WallTile>();
// ... *same code but for other Classes* ...
Tile[] tiles = FindObjectsOfType<Tile>();
var existingTiles = grounds.Union(walls);
tiles = tiles.Where(t => existingTiles.All(e => e.ID != t.ID)).ToArray();
Tile[] tiles = FindObjectsOfType<Tile>().Except(
Enumerable.Empty<Tile>()
.Concat( grounds )
...
.Concat( walls ) ).ToArray();
如果您已经将每个数组存储在它自己的变量中,如上所示,那么您可以使用 Except()
扩展方法(从 using System.Linq;
获得)过滤掉其他数组.
然后你可以做类似的事情:
GroundTile[] grounds = FindObjectsOfType<GroundTile>();
WallTile[] walls = FindObjectsOfType<WallTile>();
TrapTile[] traps = FindObjectsOfType<TrapTile>();
Tile[] tiles = FindObjectsOfType<Tile>()
.Except(traps)
.Except(walls)
.Except(grounds)
.ToArray();