Reputation: 59
I have a method, which takes an array of arbitrary type. And I have an array of objects (in my case this is a class with variable). Then I put my array of objects in this method. So how can I use a variable from this object?
public class C // This one of my classes
{
public int I { get; set; }
}
public static void Sort<T>(T[] array, string name) // Here i put my class as argument
{
...
Array.Sort<T>(array, (a, b) => a.I.CompareTo(b.I)); // Here "I" is some variable in my class, which i need to use
...
}
static void Main(string[] args) // Here i create an array of classes
{
...
C[] classes = new C[100000];
Sort(classes);
...
}
Upvotes: 1
Views: 91
Reputation: 482
I suggest you implement the IComparable<T> interface in your class, and you will not even need a dedicated sorting method
Please consider the following sample code
using System;
using System.Collections.Generic;
namespace Test
{
class Comparable : IComparable<Comparable>
{
public int Number { get; set; }
public int CompareTo(Comparable other)
{
if (other == null)
return 1;
return Number.CompareTo(other.Number);
}
}
class Program
{
static void Main()
{
List<Comparable> comparableList = new List<Comparable>
{
new Comparable { Number = 75 },
new Comparable { Number = 1 },
new Comparable { Number = 23 }
};
comparableList.Sort();
foreach (Comparable comparable in comparableList)
Console.WriteLine(comparable.Number);
}
}
}
EDIT
If you, as indicated in your comment, must use the Array.Sort()
method, then you can easily convert the list to an array and do so
Comparable[] comparableArray = comparableList.ToArray();
Array.Sort(comparableArray);
foreach (Comparable comparable in comparableArray)
Console.WriteLine(comparable.Number);
Upvotes: 1
Reputation: 29274
Is this what you want?
public class C
{
public int I { get; set; }
}
public class CComparer : IComparer<C>
{
public int Compare(C x, C y)
{
return x.I.CompareTo(y.I);
}
}
static class Program
{
static void Main(string[] args)
{
var array = new C[100];
// Calls CComparer.Compare(x,y);
Array.Sort(array, new CComparer());
}
}
An alternate version is
public class C
{
public int I { get; set; }
public static IComparer<C> Comparer { get; } = new CComparer();
class CComparer : IComparer<C>
{
internal CComparer() { }
public int Compare(C x, C y)
{
return x.I.CompareTo(y.I);
}
}
}
static class Program
{
static void Main(string[] args)
{
var array = new C[100];
Array.Sort(array, C.Comparer);
}
}
Upvotes: 1