我正在寻找一种方法来替换列表中的每个int元素,并将其首次出现的索引替换为单独的Distinct列表。例如,请使用以下列表:
<50, 2, 4, 5, 43, 42, 44, 14, 50, 44, 23, 2, 16, 4, 5, 23, 33 ... >
不同的列表如下所示:
<50, 2, 4, 5, 43, 42, 44, 14, 50, 23, 33 ... >
我希望列表内容如下:
<0, 1, 2, 3, 4, 5, 6, 7, 0, 6, 8, 1, 9, 3, 4, 8, 10 ...>
我是LINQ运营商的新手,但我有以下代码:
//Retrieve original list:
List<int> SubFaceList = FaceList.GetRange (faceBounds [fb], faceBounds [fb + 1]);
// Get unique face list entries:
List<int> UniqueFaceList = SubFaceList.Distinct ().ToList ();
//Replace values with first ocurrence:
List<int> RestructuredList = SubFaceList.Select ((vx,ix) => UniqueFaceList.IndexOf(vx)).ToList();
我这样做是为了将大型Collada三角形3D网格分割成更小的子网格。数组是面构造顺序,它引用单独数组中的顶点索引,因此可以在面数组中多次引用数字。但是,在执行我的代码时,某些网格需要花费30分钟来处理。
我还有以下代码,它从主顶点数组中提取给定顶点,这似乎没有遭受同样严重的低效率:
List<Vector3> subVertices = Vertices.Where ((vx, ix) => UniqueFaceList.Contains (ix)).Select (vx => vx).ToList();
我是否认为这是错误的,是否有可能根据此语句中正在处理的当前顶点提取索引?我知道必须有一种更有效的方法来获取我需要的信息,但我不太确定如何。
答案 0 :(得分:3)
LINQ可以实现,但如果您想获得最佳性能,可以使用Dictionary
和简单for
/ foreach
循环(您会发现代码不是那么大)最有效的LINQ解决方案):
var indexMap = new Dictionary<int, int>();
var RestructuredList = new List<int>(SubFaceList.Count); // final capacity
foreach (var item in SubFaceList)
{
int index;
if (!indexMap.TryGetValue(item, out index))
indexMap.Add(item, index = indexMap.Count);
RestructuredList.Add(index);
}
答案 1 :(得分:0)
将值和索引存储到字典中。
int main(void)
{
FILE *outfile = NULL;
outfile = fopen("battleship.log", "w");
Game_Board person, computer;
int who_goes_first = 0;
strcpy(person.symbol, '~');
person.row = 10;
person.col = 10;
strcpy(computer.symbol, '~');
computer.row = 10;
computer.col = 10;
welcome_screen(outfile);
printf("Player 1\n");
initalize_game_board(person);