C# 从数组中删除与另一个数组中的元素相比重复的元素

C# 从数组中删除与另一个数组中的元素相比重复的元素,c#,arrays,linq,unity5,C#,Arrays,Linq,Unity5,我在许多子类中扩展了超类Tile,如GroundTile,wallttile,TrapTile等。 在另一个类中,让我们调用它Main,我可以使用一个函数将这些类的所有实例作为数组检索 Main(){ void MyFunctionThatDoesThings(){ GroundTile[] grounds = FindObjectsOfType<GroundTile>(); WallTile[] walls = FindObjectsOfType<Wa

我在许多子类中扩展了超类
Tile
,如
GroundTile
wallttile
TrapTile
等。
在另一个类中,让我们调用它
Main
,我可以使用一个函数将这些类的所有实例作为数组检索

Main(){  
  void MyFunctionThatDoesThings(){
    GroundTile[] grounds = FindObjectsOfType<GroundTile>();
    WallTile[] walls = FindObjectsOfType<WallTile>();
    // ... *same code but for other Classes* ...
    Tile[] tiles = FindObjectsOfType<Tile>();
    // ... etc
  }
}
Main(){
void myfunction that doesthings(){
GroundTile[]grounds=FindObjectsOfType();
WallTile[]walls=FindObjectSoftType();
//…*相同的代码,但适用于其他类*。。。
Tile[]tiles=FindObjectsOfType();
//…等等
}
}
我需要做的是从
tiles
array中筛选其他数组中不存在的元素。
除了在
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));
List l=新列表{1,2,4};
列表s=新列表{1,2,3};
var结果=s,其中(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();
GroundTile[]grounds=FindObjectsOfType();
WallTile[]walls=FindObjectSoftType();
// ... *相同的代码,但适用于其他类*。。。
Tile[]tiles=FindObjectsOfType();
var existingTiles=接地。接头(墙);
tiles=tiles.Where(t=>existingTiles.All(e=>e.ID!=t.ID)).ToArray();
Tile[]tiles=FindObjectsOfType()。除了(
Enumerable.Empty()
.Concat(地面)
...
.Concat(墙)).ToArray();

如果您已经将每个数组存储在上面显示的它自己的变量中,那么您可以使用
Except()
扩展方法(使用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();
GroundTile[]grounds=FindObjectsOfType();
WallTile[]walls=FindObjectSoftType();
TrapTile[]traps=FindObjectsOfType();
Tile[]tiles=FindObjectsOfType()
.除(陷阱)
.除(墙壁)
.除(理由)外
.ToArray();

为什么需要转换为列表?正确。这不是必需的。谢谢你指出。我会更新的。你应该用All而不是ANY。我理解你的逻辑,它应该是有效的。但是我得到了这个错误:
CS1929:Type'GroundTile[]不包含成员'Union'和最佳扩展方法重载'System.Linq.Queryable.Union(this System.Linq.IQueryable,System.Collections.Generic.IEnumerable)'需要'System.Linq.IQueryable'类型的实例。
@DamianoCaprari您是否使用System.Linq添加了
Union
系统中的扩展方法。Linq
Namespace您不能只使用
grounds.Concat
?这与@Sir Rufo的回答几乎相同。而且读起来更“干净”。非常感谢。
GroundTile[] grounds = FindObjectsOfType<GroundTile>();
WallTile[] walls = FindObjectsOfType<WallTile>();
TrapTile[] traps = FindObjectsOfType<TrapTile>();

Tile[] tiles = FindObjectsOfType<Tile>()
    .Except(traps)
    .Except(walls)
    .Except(grounds)
    .ToArray();