.NET Sorting: Compare Just About Any Property of Any Object California

Implement the generic interface IComparer with some reflection, and .NET will provide sorting that compares just about any property of any object. See how it's done.

Local Companies

Appian Analytics
510-710-9199
2000 Crow Canyon Place Suite 300
San Ramon, CA
Web Studios West
(877) 225-9772
2219 W.Olive Ave #213
Burbank, CA
C&R Web Services
877-651-9136
P.O. Box 2453
Santa Clara, CA
FAST SOFTWARE SOLUTIONS
619-886-2916
1037 WILBUR AVE
SAN DIEGO, CA
Callbox, Inc.
(310) 439-5814
16770 Encino Hills Dr. Suite 200
Encino, CA
Fillmore Technology Group
(510) 864-0740
1001 Marina Village Parkway, Suite 404
Alameda, CA
Concierge for Business
408 993-1368
472 Clifton Avenue
San Jose, CA
Integrated Sales Management, Inc
(877) 553-0485
7545 Irvine Center Dr. Suite 200
Irvine, CA
Team Interactions, Inc.
760-655-4055 ext. 211
2382 Faraday Ave., Suite 310
Carlsbad, CA
SiteLab
858-456-4720
2223 Avenida de la Playa, Suite 208
La Jolla, CA


.NET Sorting: Compare Just About Any Property of Any Object

provided by: 
Originally published at Internet.com


Archimedes once claimed that given a lever long enough, a fulcrum strong enough, and a place to stand, he could move the world. (Archimedes also reportedly ran through the streets of Athens naked shouting Eureka when he discovered displacement, but that's another story.) Advanced techniques such as interfaces, reflection, and generics may not enable you to move the world, but they are sufficient tools for doing a lot of work, which is what Archimedes meant.

One such powerful tool that the .NET Framework provides is the generic interface IComparer. Implement IComparer and provide the type of object to compare, and .NET supports sorting any kind of collection of objects. Implement IComparer and fold in some reflection, and your IComparer will compare just about any property of any object. Using reflection won't yield a lightening fast sort, but the tradeoff for speed is flexibility.

Implementing IComparer

IComparer takes a parameter type T and two arguments of type T. Your job is to implement the comparison behavior and return -1 for x < y, 0 for x = y, and >0 for x > y. You can slightly enhance this basic comparison behavior by passing in a property name to the constructor, passing in an enumerated value to indicate sort direction, and using reflection to obtain access to the property value.

Listing 1 shows how you can specify the value of enumerated fields to reverse the results of the sort behavior:

Listing 1: An Enumeration with Specific Values Public Enum SortDirection Descending = -1 Ascending = 1 Enum

By multiplying the return value of a comparison by 1 or -1, you change the direction of the sort.

Listing 2 shows the implementation of the PropertyComparer class, which uses reflection to ensure that the field either implements IComparable or has a CompareTo method:

Listing 2: The PropertyComparer Public Class PropertyComparer(Of T) Implements IComparer(Of T) Private FPropertyName As String = "" Private FDirection As SortDirection Public Sub New(ByVal propertyName As String) FPropertyName = propertyName FDirection = SortDirection.Ascending End Sub Public Sub New(ByVal propertyName As String, _ ByVal Direction As SortDirection) FPropertyName = propertyName FDirection = Direction End Sub ' Try to sort based on type using CompareTo method ' Multiple by FDirection to alternate sort direction Public Function Compare(ByVal x As T, ByVal y As T) _ As Integer Implements System.Collections.Generic. _ IComparer(Of T).Compare Dim propertyX As PropertyInfo = _ x.GetType().GetProperty(FPropertyName) Dim propertyY As PropertyInfo = _ y.GetType().GetProperty(FPropertyName) Dim px As Object = propertyX.GetValue(x, Nothing) Dim py As Object = propertyY.GetValue(y, Nothing) If (TypeOf px Is Integer) Then Return Compare(Of Integer)(CType(px, Integer), _ CType(py, Integer)) * FDirection End If If (TypeOf px Is Decimal) Then Return Compare(Of Decimal)(CType(px, Decimal), _ CType(py, Decimal)) * FDirection End If If (TypeOf px Is DateTime) Then Return Compare(Of DateTime)(CType(px, DateTime), _ CType(py, DateTime)) * FDirection End If If (TypeOf px Is Double) Then Return Compare(Of Double)(CType(px, Double), _ CType(py, Double)) * FDirection End If If (TypeOf px Is String) Then Return Compare(Of String)(CType(px, String), _ CType(py, String)) * FDirection End If If (TypeOf px Is Decimal) Then Return Compare(Of Decimal)(CType(px, Decimal), _ CType(py, Decimal)) * FDirection End If Dim methodX As MethodInfo = _ propertyX.GetTyppe().GetMethod("CompareTo") If (methodX Is Nothing = False) Then Return CType(methodX.Invoke(px, New Object() {py}), _ Integer) * FDirection Else Return 0 End If End Function Private Function Compare(Of K As IComparable)(ByVal x As K, _ ByVal y As K) As Integer Return x.CompareTo(y) End Function End Class

The PropertyComparer class uses reflection to get the type information for the property passed into the PropertyComparer's constructor and attempts to call the property's CompareTo method (if it exists). If the property has a CompareTo method, the comparison will work. If no CompareTo method exists, the Compare method returns 0, which has a benign effect.

The key to understanding the PropertyComparer class lies in the boldfaced code of Listing 2. The first thing Compare does is get the PropertyInfo record for the x and y arguments. Next, it obtains the value of the property using the argument's x and y and the PropertyInfo record. Finally, it inspects the type of the property to determine how to call the Compare method implemented at the end of the class. The Compare method implemented has a where predicate that limits the types of the parameter K to those that implement IComparable. The reason for this is that IComparable types implement CompareTo.

Defining Something to Sort

You can sort just about anything. To make the demonstration reflect something you may be familiar with, Listing 3 contains an implementation of a simple Customer class:

Listing 3: A Simple Customer Class Public Class Customer Private FCustomerNumber As Integer Private FName As String Public Sub New(ByVal customerNumber As Integer, _ ByVal name As String) FCustomerNumber = customerNumber FName = name End Sub Public ReadOnly Property CustomerNumber() As Integer Get Return FCustomerNumber End Get End Property Public Property Name() As String Get Return FName End Get Set(ByVal value As String) FName = value End Set End Property End Class

You can sort a list of Customer objects by the Name or CustomerNumber.

Invoking the Sort Behavior

Listing 4 demonstrates how to create a generic list of strongly typed Customer objects, add some Customers to the list, and sort the Customers by Name:

Listing 4: Code to Demonstrate the PropertyComparer Imports System Imports System.Collections.Generic Imports System.Text Imports System.Reflection Module Module1 Sub Main() Dim list As List(Of Customer) = New List(Of Customer) list.Add(New Customer("Paul")) list.Add(New Customer("Noah")) list.Add(New Customer("Alex")) list.Add(New Customer("Jim")) list.Sort(New PropertyComparer(Of Customer)("Name")) Dim o As Customer For Each o In list Console.WriteLine(o.Name) Next Console.ReadLine() End Sub End Module

If you changed the construction of the PropertyComparer to initialize the PropertyComparer with the CustomerNumber property name, you would get a completely different sort result.

A General Technique for Sorting Objects

Advanced techniques are the lever, fulcrum, and place to stand that can help you move mountains. This example combined reflection, interfaces, and generics to create a general technique for sorting objects based on any field.

I use a variation of the PropertyComparer in production, and it's a nice addition to the sorting behavior in .NET.

Acknowledgements

Special thanks to my very smart friend Chris Chartrand in Ontario for coming up with the directional variation of my original PropertyComparer class.

About the Author

Paul Kimmel is the VB Today columnist for www.codeguru.com and has written several books on object-oriented programming and .NET. Check out his new book UML DeMystified from McGraw-Hill/Osborne. Paul is an architect for Tri-State Hospital Supply Corporation. You may contact him for technology questions at pkimmel@softconcepts.com.

If you are interested in joining or sponsoring a .NET Users Group, check out www.glugnet.org.

Author: Paul Kimmel

Read article at Internet.com site

Featured Local Company

Silicomp America

1-888-674-5426
39899 Balentine Drive
Newark, CA
http://www.silicomp.com

Regional Articles
- .NET Sorting: Compare Just About Any Property of Any Object Adelanto CA
- .NET Sorting: Compare Just About Any Property of Any Object Agoura Hills CA
- .NET Sorting: Compare Just About Any Property of Any Object Alameda CA
- .NET Sorting: Compare Just About Any Property of Any Object Alhambra CA
- .NET Sorting: Compare Just About Any Property of Any Object Aliso Viejo CA
- .NET Sorting: Compare Just About Any Property of Any Object Alpine CA
- .NET Sorting: Compare Just About Any Property of Any Object Altadena CA
- .NET Sorting: Compare Just About Any Property of Any Object Anaheim CA
- .NET Sorting: Compare Just About Any Property of Any Object Antelope CA
- .NET Sorting: Compare Just About Any Property of Any Object Antioch CA
- .NET Sorting: Compare Just About Any Property of Any Object Apple Valley CA
- .NET Sorting: Compare Just About Any Property of Any Object Aptos CA
- .NET Sorting: Compare Just About Any Property of Any Object Arcadia CA
- .NET Sorting: Compare Just About Any Property of Any Object Arcata CA
- .NET Sorting: Compare Just About Any Property of Any Object Arroyo Grande CA
- .NET Sorting: Compare Just About Any Property of Any Object Arvin CA
- .NET Sorting: Compare Just About Any Property of Any Object Atascadero CA
- .NET Sorting: Compare Just About Any Property of Any Object Atwater CA
- .NET Sorting: Compare Just About Any Property of Any Object Auburn CA
- .NET Sorting: Compare Just About Any Property of Any Object Avenal CA
- .NET Sorting: Compare Just About Any Property of Any Object Azusa CA
- .NET Sorting: Compare Just About Any Property of Any Object Bakersfield CA
- .NET Sorting: Compare Just About Any Property of Any Object Baldwin Park CA
- .NET Sorting: Compare Just About Any Property of Any Object Banning CA
- .NET Sorting: Compare Just About Any Property of Any Object Barstow CA
- .NET Sorting: Compare Just About Any Property of Any Object Bell CA
- .NET Sorting: Compare Just About Any Property of Any Object Bellflower CA
- .NET Sorting: Compare Just About Any Property of Any Object Belmont CA
- .NET Sorting: Compare Just About Any Property of Any Object Benicia CA
- .NET Sorting: Compare Just About Any Property of Any Object Berkeley CA
- .NET Sorting: Compare Just About Any Property of Any Object Beverly Hills CA
- .NET Sorting: Compare Just About Any Property of Any Object Bloomington CA
- .NET Sorting: Compare Just About Any Property of Any Object Blythe CA
- .NET Sorting: Compare Just About Any Property of Any Object Bonita CA
- .NET Sorting: Compare Just About Any Property of Any Object Brawley CA
- .NET Sorting: Compare Just About Any Property of Any Object Brea CA
- .NET Sorting: Compare Just About Any Property of Any Object Brentwood CA
- .NET Sorting: Compare Just About Any Property of Any Object Buena Park CA
- .NET Sorting: Compare Just About Any Property of Any Object Burbank CA
- .NET Sorting: Compare Just About Any Property of Any Object Burlingame CA
- .NET Sorting: Compare Just About Any Property of Any Object Calabasas CA
- .NET Sorting: Compare Just About Any Property of Any Object Calexico CA
- .NET Sorting: Compare Just About Any Property of Any Object Camarillo CA
- .NET Sorting: Compare Just About Any Property of Any Object Campbell CA
- .NET Sorting: Compare Just About Any Property of Any Object Canoga Park CA
- .NET Sorting: Compare Just About Any Property of Any Object Canyon Country CA
- .NET Sorting: Compare Just About Any Property of Any Object Carlsbad CA
- .NET Sorting: Compare Just About Any Property of Any Object Carmichael CA
- .NET Sorting: Compare Just About Any Property of Any Object Carpinteria CA
- .NET Sorting: Compare Just About Any Property of Any Object Carson CA
- .NET Sorting: Compare Just About Any Property of Any Object Castaic CA
- .NET Sorting: Compare Just About Any Property of Any Object Castro Valley CA
- .NET Sorting: Compare Just About Any Property of Any Object Cathedral City CA
- .NET Sorting: Compare Just About Any Property of Any Object Ceres CA
- .NET Sorting: Compare Just About Any Property of Any Object Cerritos CA
- .NET Sorting: Compare Just About Any Property of Any Object Chatsworth CA
- .NET Sorting: Compare Just About Any Property of Any Object Chico CA
- .NET Sorting: Compare Just About Any Property of Any Object Chino CA
- .NET Sorting: Compare Just About Any Property of Any Object Chino Hills CA
- .NET Sorting: Compare Just About Any Property of Any Object Chowchilla CA
- .NET Sorting: Compare Just About Any Property of Any Object Chula Vista CA
- .NET Sorting: Compare Just About Any Property of Any Object Citrus Heights CA
- .NET Sorting: Compare Just About Any Property of Any Object Claremont CA
- .NET Sorting: Compare Just About Any Property of Any Object Clovis CA
- .NET Sorting: Compare Just About Any Property of Any Object Coachella CA
- .NET Sorting: Compare Just About Any Property of Any Object Coalinga CA
- .NET Sorting: Compare Just About Any Property of Any Object Colton CA
- .NET Sorting: Compare Just About Any Property of Any Object Compton CA
- .NET Sorting: Compare Just About Any Property of Any Object Concord CA
- .NET Sorting: Compare Just About Any Property of Any Object Corcoran CA
- .NET Sorting: Compare Just About Any Property of Any Object Corona CA
- .NET Sorting: Compare Just About Any Property of Any Object Coronado CA
- .NET Sorting: Compare Just About Any Property of Any Object Costa Mesa CA
- .NET Sorting: Compare Just About Any Property of Any Object Covina CA
- .NET Sorting: Compare Just About Any Property of Any Object Crescent City CA
- .NET Sorting: Compare Just About Any Property of Any Object Culver City CA
- .NET Sorting: Compare Just About Any Property of Any Object Cupertino CA
- .NET Sorting: Compare Just About Any Property of Any Object Cypress CA
- .NET Sorting: Compare Just About Any Property of Any Object Daly City CA
- .NET Sorting: Compare Just About Any Property of Any Object Dana Point CA
- .NET Sorting: Compare Just About Any Property of Any Object Danville CA
- .NET Sorting: Compare Just About Any Property of Any Object Davis CA
- .NET Sorting: Compare Just About Any Property of Any Object Delano CA
- .NET Sorting: Compare Just About Any Property of Any Object Desert Hot Springs CA
- .NET Sorting: Compare Just About Any Property of Any Object Diamond Bar CA
- .NET Sorting: Compare Just About Any Property of Any Object Dinuba CA
- .NET Sorting: Compare Just About Any Property of Any Object Downey CA
- .NET Sorting: Compare Just About Any Property of Any Object Duarte CA
- .NET Sorting: Compare Just About Any Property of Any Object Dublin CA
- .NET Sorting: Compare Just About Any Property of Any Object El Cajon CA
- .NET Sorting: Compare Just About Any Property of Any Object El Centro CA
- .NET Sorting: Compare Just About Any Property of Any Object El Cerrito CA
- .NET Sorting: Compare Just About Any Property of Any Object El Dorado Hills CA
- .NET Sorting: Compare Just About Any Property of Any Object El Monte CA
- .NET Sorting: Compare Just About Any Property of Any Object El Segundo CA
- .NET Sorting: Compare Just About Any Property of Any Object El Sobrante CA
- .NET Sorting: Compare Just About Any Property of Any Object Elk Grove CA
- .NET Sorting: Compare Just About Any Property of Any Object Emeryville CA
- .NET Sorting: Compare Just About Any Property of Any Object Encinitas CA
- .NET Sorting: Compare Just About Any Property of Any Object Encino CA
- .NET Sorting: Compare Just About Any Property of Any Object Escondido CA
- .NET Sorting: Compare Just About Any Property of Any Object Eureka CA
- .NET Sorting: Compare Just About Any Property of Any Object Fair Oaks CA
- .NET Sorting: Compare Just About Any Property of Any Object Fairfield CA
- .NET Sorting: Compare Just About Any Property of Any Object Fallbrook CA
- .NET Sorting: Compare Just About Any Property of Any Object Fillmore CA
- .NET Sorting: Compare Just About Any Property of Any Object Folsom CA
- .NET Sorting: Compare Just About Any Property of Any Object Fontana CA
- .NET Sorting: Compare Just About Any Property of Any Object Fountain Valley CA
- .NET Sorting: Compare Just About Any Property of Any Object Fremont CA
- .NET Sorting: Compare Just About Any Property of Any Object Fresno CA
- .NET Sorting: Compare Just About Any Property of Any Object Fullerton CA
- .NET Sorting: Compare Just About Any Property of Any Object Galt CA
- .NET Sorting: Compare Just About Any Property of Any Object Garden Grove CA
- .NET Sorting: Compare Just About Any Property of Any Object Gardena CA
- .NET Sorting: Compare Just About Any Property of Any Object Gilroy CA
- .NET Sorting: Compare Just About Any Property of Any Object Glendale CA
- .NET Sorting: Compare Just About Any Property of Any Object Glendora CA
- .NET Sorting: Compare Just About Any Property of Any Object Goleta CA
- .NET Sorting: Compare Just About Any Property of Any Object Granada Hills CA
- .NET Sorting: Compare Just About Any Property of Any Object Granite Bay CA
- .NET Sorting: Compare Just About Any Property of Any Object Grass Valley CA
- .NET Sorting: Compare Just About Any Property of Any Object Hacienda Heights CA
- .NET Sorting: Compare Just About Any Property of Any Object Half Moon Bay CA
- .NET Sorting: Compare Just About Any Property of Any Object Hanford CA
- .NET Sorting: Compare Just About Any Property of Any Object Harbor City CA
- .NET Sorting: Compare Just About Any Property of Any Object Hawaiian Gardens CA
- .NET Sorting: Compare Just About Any Property of Any Object Hawthorne CA
- .NET Sorting: Compare Just About Any Property of Any Object Hayward CA
- .NET Sorting: Compare Just About Any Property of Any Object Healdsburg CA
- .NET Sorting: Compare Just About Any Property of Any Object Hemet CA
- .NET Sorting: Compare Just About Any Property of Any Object Hercules CA
- .NET Sorting: Compare Just About Any Property of Any Object Hermosa Beach CA
- .NET Sorting: Compare Just About Any Property of Any Object Hesperia CA
- .NET Sorting: Compare Just About Any Property of Any Object Highland CA
- .NET Sorting: Compare Just About Any Property of Any Object Hollister CA
- .NET Sorting: Compare Just About Any Property of Any Object Huntington Beach CA
- .NET Sorting: Compare Just About Any Property of Any Object Huntington Park CA
- .NET Sorting: Compare Just About Any Property of Any Object Imperial Beach CA
- .NET Sorting: Compare Just About Any Property of Any Object Indio CA
- .NET Sorting: Compare Just About Any Property of Any Object Inglewood CA
- .NET Sorting: Compare Just About Any Property of Any Object Irvine CA
- .NET Sorting: Compare Just About Any Property of Any Object King City CA
- .NET Sorting: Compare Just About Any Property of Any Object La Canada Flintridge CA
- .NET Sorting: Compare Just About Any Property of Any Object La Crescenta CA
- .NET Sorting: Compare Just About Any Property of Any Object La Habra CA
- .NET Sorting: Compare Just About Any Property of Any Object La Jolla CA
- .NET Sorting: Compare Just About Any Property of Any Object La Mesa CA
- .NET Sorting: Compare Just About Any Property of Any Object La Mirada CA
- .NET Sorting: Compare Just About Any Property of Any Object La Palma CA
- .NET Sorting: Compare Just About Any Property of Any Object La Puente CA
- .NET Sorting: Compare Just About Any Property of Any Object La Quinta CA
- .NET Sorting: Compare Just About Any Property of Any Object La Verne CA
- .NET Sorting: Compare Just About Any Property of Any Object Laguna Beach CA
- .NET Sorting: Compare Just About Any Property of Any Object Laguna Hills CA
- .NET Sorting: Compare Just About Any Property of Any Object Laguna Niguel CA
- .NET Sorting: Compare Just About Any Property of Any Object Lake Elsinore CA
- .NET Sorting: Compare Just About Any Property of Any Object Lake Forest CA
- .NET Sorting: Compare Just About Any Property of Any Object Lakeside CA
- .NET Sorting: Compare Just About Any Property of Any Object Lakewood CA
- .NET Sorting: Compare Just About Any Property of Any Object Lamont CA
- .NET Sorting: Compare Just About Any Property of Any Object Lancaster CA
- .NET Sorting: Compare Just About Any Property of Any Object Lawndale CA
- .NET Sorting: Compare Just About Any Property of Any Object Lemon Grove CA
- .NET Sorting: Compare Just About Any Property of Any Object Lemoore CA
- .NET Sorting: Compare Just About Any Property of Any Object Livermore CA
- .NET Sorting: Compare Just About Any Property of Any Object Lodi CA
- .NET Sorting: Compare Just About Any Property of Any Object Loma Linda CA
- .NET Sorting: Compare Just About Any Property of Any Object Lomita CA
- .NET Sorting: Compare Just About Any Property of Any Object Lompoc CA
- .NET Sorting: Compare Just About Any Property of Any Object Long Beach CA
- .NET Sorting: Compare Just About Any Property of Any Object Los Alamitos CA
- .NET Sorting: Compare Just About Any Property of Any Object Los Altos CA
- .NET Sorting: Compare Just About Any Property of Any Object Los Angeles CA
- .NET Sorting: Compare Just About Any Property of Any Object Los Banos CA
- .NET Sorting: Compare Just About Any Property of Any Object Los Gatos CA
- .NET Sorting: Compare Just About Any Property of Any Object Los Osos CA
- .NET Sorting: Compare Just About Any Property of Any Object Lynwood CA
- .NET Sorting: Compare Just About Any Property of Any Object Madera CA
- .NET Sorting: Compare Just About Any Property of Any Object Malibu CA
- .NET Sorting: Compare Just About Any Property of Any Object Manhattan Beach CA
- .NET Sorting: Compare Just About Any Property of Any Object Manteca CA
- .NET Sorting: Compare Just About Any Property of Any Object Marina CA
- .NET Sorting: Compare Just About Any Property of Any Object Marina Del Rey CA
- .NET Sorting: Compare Just About Any Property of Any Object Martinez CA
- .NET Sorting: Compare Just About Any Property of Any Object Marysville CA
- .NET Sorting: Compare Just About Any Property of Any Object Maywood CA
- .NET Sorting: Compare Just About Any Property of Any Object Mckinleyville CA
- .NET Sorting: Compare Just About Any Property of Any Object Menlo Park CA
- .NET Sorting: Compare Just About Any Property of Any Object Merced CA
- .NET Sorting: Compare Just About Any Property of Any Object Mill Valley CA
- .NET Sorting: Compare Just About Any Property of Any Object Millbrae CA
- .NET Sorting: Compare Just About Any Property of Any Object Milpitas CA
- .NET Sorting: Compare Just About Any Property of Any Object Mira Loma CA
- .NET Sorting: Compare Just About Any Property of Any Object Mission Hills CA
- .NET Sorting: Compare Just About Any Property of Any Object Mission Viejo CA
- .NET Sorting: Compare Just About Any Property of Any Object Modesto CA
- .NET Sorting: Compare Just About Any Property of Any Object Monrovia CA
- .NET Sorting: Compare Just About Any Property of Any Object Montclair CA
- .NET Sorting: Compare Just About Any Property of Any Object Montebello CA
- .NET Sorting: Compare Just About Any Property of Any Object Monterey CA
- .NET Sorting: Compare Just About Any Property of Any Object Monterey Park CA
- .NET Sorting: Compare Just About Any Property of Any Object Moorpark CA
- .NET Sorting: Compare Just About Any Property of Any Object Moraga CA
- .NET Sorting: Compare Just About Any Property of Any Object Moreno Valley CA
- .NET Sorting: Compare Just About Any Property of Any Object Morgan Hill CA
- .NET Sorting: Compare Just About Any Property of Any Object Mountain View CA
- .NET Sorting: Compare Just About Any Property of Any Object Murrieta CA
- .NET Sorting: Compare Just About Any Property of Any Object Napa CA
- .NET Sorting: Compare Just About Any Property of Any Object National City CA
- .NET Sorting: Compare Just About Any Property of Any Object Nevada City CA
- .NET Sorting: Compare Just About Any Property of Any Object Newark CA
- .NET Sorting: Compare Just About Any Property of Any Object Newbury Park CA
- .NET Sorting: Compare Just About Any Property of Any Object Newhall CA
- .NET Sorting: Compare Just About Any Property of Any Object Newport Beach CA
- .NET Sorting: Compare Just About Any Property of Any Object Nipomo CA
- .NET Sorting: Compare Just About Any Property of Any Object Norco CA
- .NET Sorting: Compare Just About Any Property of Any Object North Highlands CA
- .NET Sorting: Compare Just About Any Property of Any Object North Hills CA
- .NET Sorting: Compare Just About Any Property of Any Object North Hollywood CA
- .NET Sorting: Compare Just About Any Property of Any Object Northridge CA
- .NET Sorting: Compare Just About Any Property of Any Object Norwalk CA
- .NET Sorting: Compare Just About Any Property of Any Object Novato CA
- .NET Sorting: Compare Just About Any Property of Any Object Oakdale CA
- .NET Sorting: Compare Just About Any Property of Any Object Oakland CA
- .NET Sorting: Compare Just About Any Property of Any Object Oakley CA
- .NET Sorting: Compare Just About Any Property of Any Object Oceanside CA
- .NET Sorting: Compare Just About Any Property of Any Object Ojai CA
- .NET Sorting: Compare Just About Any Property of Any Object Ontario CA
- .NET Sorting: Compare Just About Any Property of Any Object Orange CA
- .NET Sorting: Compare Just About Any Property of Any Object Orangevale CA
- .NET Sorting: Compare Just About Any Property of Any Object Orinda CA
- .NET Sorting: Compare Just About Any Property of Any Object Oroville CA
- .NET Sorting: Compare Just About Any Property of Any Object Oxnard CA
- .NET Sorting: Compare Just About Any Property of Any Object Pacific Grove CA
- .NET Sorting: Compare Just About Any Property of Any Object Pacific Palisades CA
- .NET Sorting: Compare Just About Any Property of Any Object Pacifica CA
- .NET Sorting: Compare Just About Any Property of Any Object Pacoima CA
- .NET Sorting: Compare Just About Any Property of Any Object Palm Desert CA
- .NET Sorting: Compare Just About Any Property of Any Object Palm Springs CA
- .NET Sorting: Compare Just About Any Property of Any Object Palmdale CA
- .NET Sorting: Compare Just About Any Property of Any Object Palo Alto CA
- .NET Sorting: Compare Just About Any Property of Any Object Palos Verdes Peninsula CA
- .NET Sorting: Compare Just About Any Property of Any Object Panorama City CA
- .NET Sorting: Compare Just About Any Property of Any Object Paradise CA
- .NET Sorting: Compare Just About Any Property of Any Object Paramount CA
- .NET Sorting: Compare Just About Any Property of Any Object Pasadena CA
- .NET Sorting: Compare Just About Any Property of Any Object Paso Robles CA
- .NET Sorting: Compare Just About Any Property of Any Object Patterson CA
- .NET Sorting: Compare Just About Any Property of Any Object Perris CA
- .NET Sorting: Compare Just About Any Property of Any Object Petaluma CA
- .NET Sorting: Compare Just About Any Property of Any Object Pico Rivera CA
- .NET Sorting: Compare Just About Any Property of Any Object Pinole CA
- .NET Sorting: Compare Just About Any Property of Any Object Pittsburg CA
- .NET Sorting: Compare Just About Any Property of Any Object Placentia CA
- .NET Sorting: Compare Just About Any Property of Any Object Placerville CA
- .NET Sorting: Compare Just About Any Property of Any Object Pleasant Hill CA
- .NET Sorting: Compare Just About Any Property of Any Object Pleasanton CA
- .NET Sorting: Compare Just About Any Property of Any Object Pomona CA
- .NET Sorting: Compare Just About Any Property of Any Object Port Hueneme CA
- .NET Sorting: Compare Just About Any Property of Any Object Porterville CA
- .NET Sorting: Compare Just About Any Property of Any Object Poway CA
- .NET Sorting: Compare Just About Any Property of Any Object Ramona CA
- .NET Sorting: Compare Just About Any Property of Any Object Rancho Cordova CA
- .NET Sorting: Compare Just About Any Property of Any Object Rancho Cucamonga CA
- .NET Sorting: Compare Just About Any Property of Any Object Rancho Palos Verdes CA
- .NET Sorting: Compare Just About Any Property of Any Object Rancho Santa Margarita CA
- .NET Sorting: Compare Just About Any Property of Any Object Red Bluff CA
- .NET Sorting: Compare Just About Any Property of Any Object Redding CA
- .NET Sorting: Compare Just About Any Property of Any Object Redlands CA
- .NET Sorting: Compare Just About Any Property of Any Object Redondo Beach CA
- .NET Sorting: Compare Just About Any Property of Any Object Redwood City CA
- .NET Sorting: Compare Just About Any Property of Any Object Reedley CA
- .NET Sorting: Compare Just About Any Property of Any Object Reseda CA
- .NET Sorting: Compare Just About Any Property of Any Object Rialto CA
- .NET Sorting: Compare Just About Any Property of Any Object Richmond CA
- .NET Sorting: Compare Just About Any Property of Any Object Ridgecrest CA
- .NET Sorting: Compare Just About Any Property of Any Object Riverbank CA
- .NET Sorting: Compare Just About Any Property of Any Object Riverside CA
- .NET Sorting: Compare Just About Any Property of Any Object Rocklin CA
- .NET Sorting: Compare Just About Any Property of Any Object Rohnert Park CA
- .NET Sorting: Compare Just About Any Property of Any Object Rosamond CA
- .NET Sorting: Compare Just About Any Property of Any Object Rosemead CA
- .NET Sorting: Compare Just About Any Property of Any Object Roseville CA
- .NET Sorting: Compare Just About Any Property of Any Object Rowland Heights CA
- .NET Sorting: Compare Just About Any Property of Any Object Sacramento CA
- .NET Sorting: Compare Just About Any Property of Any Object Salinas CA
- .NET Sorting: Compare Just About Any Property of Any Object San Anselmo CA
- .NET Sorting: Compare Just About Any Property of Any Object San Bernardino CA
- .NET Sorting: Compare Just About Any Property of Any Object San Bruno CA
- .NET Sorting: Compare Just About Any Property of Any Object San Carlos CA
- .NET Sorting: Compare Just About Any Property of Any Object San Clemente CA
- .NET Sorting: Compare Just About Any Property of Any Object San Diego CA
- .NET Sorting: Compare Just About Any Property of Any Object San Dimas CA
- .NET Sorting: Compare Just About Any Property of Any Object San Fernando CA
- .NET Sorting: Compare Just About Any Property of Any Object San Francisco CA
- .NET Sorting: Compare Just About Any Property of Any Object San Gabriel CA
-