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();