A combination of things can work here ... First, it is best left as a reference type so that you do not copy structures during the search. Use string.Intern(string) to reduce memory usage by double names and postal codes ... Finally, use Dictionary<TKey, TValue> to index these entries by value ... Perhaps TKey is a string in The case of FirstName and TValue ' List<Person> , so you can search for people by the specified string ... This is called an inverted index: http://en.wikipedia.org/wiki/Inverted_index - an alternative to the dictionary - implement your own Tree structure or Trie, such as the trie prefix ... You trade O (log n) speeds for less memory than the O (1) dictionary.
From the point of view of storing LOT of them in memory, it depends on how many ... but in the end you want to have enough memory to process them ... Or start expanding access to distributed systems for sharing objects, for example, a template MapReduce or "paging" to disk.
Haney source share