使用第一个出现索引

时间:2017-03-30 19:53:12

标签: c# linq list unity3d 3d

我正在寻找一种方法来替换列表中的每个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();

我是否认为这是错误的,是否有可能根据此语句中正在处理的当前顶点提取索引?我知道必须有一种更有效的方法来获取我需要的信息,但我不太确定如何。

2 个答案:

答案 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);