Click here to Skip to main content
Licence CPOL
First Posted 18 Nov 2008
Views 8,087
Downloads 13
Bookmarked 19 times

Fixed Index Array

By mpustovoyt | 18 Nov 2008
'FixIndexArray' provides direct access like a List, and has a fixed index position like a Dictionary.
1 vote, 12.5%
1
1 vote, 12.5%
2
1 vote, 12.5%
3
2 votes, 25.0%
4
3 votes, 37.5%
5
3.25/5 - 8 votes
μ 3.25, σa 2.64 [?]

Introduction

The idea about the FixIndexArray class came to me when I was looking for an array structure which will allow:

  • To have direct access to an item by index, like a List<T>.
  • To guarantee the same index during deleting an item, like a Dictionary<int,T> (analogue of a DB primary key).
  • To have higher performance of deleting/adding an item than a Dictionary<int,T>.

As a result, Ideveloped the class FixIndexArray. The final performance result shown on the picture below proves that it meets all the above requirements.

1c.JPG

Using the code

Using the class cFixIndexArr is very straightforward, and API is very similar to List<T>.

//
// This code demonstrates how to use Enumerator  
//
private void PrintArr(cFixIndexArr<int> arr) {
    Console.Write("Array : "); 
    foreach(int val in arr) {
        Console.Write(string.Format("{0}, ", val));
    }
}
//
// This code demonstrates the most common use cases  
// 
[Test]
public void UseCase() {
    Console.WriteLine(
      "Create the FixIndexArr of integers with default capacity 10"
    );  
    cFixIndexArr<int> arr = new cFixIndexArr<int>(10);
    Console.WriteLine("Load array: {0,10,20,...90}");
    for(int i=0; i<10; i++) {
        arr.Add(i*10); 
    }
    this.PrintArr(arr);
    Console.WriteLine("\r\n\r\nDelete elements 1, 3, 5, 7, 9"); 
    arr.Remove(1); 
    arr.Remove(3); 
    arr.Remove(5);
    arr.Remove(7);
    arr.Remove(9);
    this.PrintArr(arr);
    Console.WriteLine(
       "\r\n\r\nAdd element '11', '22', '33', '44', '55', '66','77'"
    );
    arr.Add(11);
    arr.Add(22);
    int index33 = arr.Add(33);
    arr.Add(44);
    arr.Add(55);
    arr.Add(66);
    arr.Add(77);
    this.PrintArr(arr);
    Console.WriteLine("\r\n\r\nReplacing element 33 by 3333");
    arr[index33] = 3333;
    this.PrintArr(arr);
    Console.WriteLine(
       "\r\n\r\nDelete element 3333 and use it for element 4444"
    );
    arr.Remove(index33);
    arr[index33] = 4444;
    this.PrintArr(arr);
}

This code produces the following result:

2c.JPG

How does it work?

The idea behind is simple: The class FixIndexArr<T> uses an array valArr of type List<T> for elements itself, and a helper array deletedIndexArr of type List<cItem> for tracking the deleted indexes. The structure cItem is a helper, and contains information about deleted indices in a double linked list manner:

3c.JPG

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

mpustovoyt

Software Developer (Senior)
SSI
United States United States

Member
Developer Pascal, c, c++, VB, Java, C#

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionHave you tried KeyedCollection<k,>? PinmemberPaul B.4:44 25 Nov '08  
AnswerRe: Have you tried KeyedCollection<k,>? Pinmembermpustovoyt16:29 25 Nov '08  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web02 | 2.5.120210.1 | Last Updated 18 Nov 2008
Article Copyright 2008 by mpustovoyt
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid