C# 具有不同类型值的OrderBy列表

C# 具有不同类型值的OrderBy列表,c#,linq,c#-4.0,C#,Linq,C# 4.0,我有多种类型的列表。糟糕的 List<object> list = new List<object>() { 11.21, 323, 4, 3221, 221, 2, "asd" }; var qu = list.OrderBy((o) => o); qu.ToList().ForEach((e) => Console.WriteLine(e)); // throws exception List List=newlist(){11.21323432212,

我有多种类型的列表。糟糕的

List<object> list = new List<object>() { 11.21, 323, 4, 3221, 221, 2, "asd" };
var qu = list.OrderBy((o) => o);
qu.ToList().ForEach((e) => Console.WriteLine(e)); // throws exception
List List=newlist(){11.21323432212,“asd”};
var qu=list.OrderBy((o)=>o);
qu.ToList().ForEach((e)=>Console.WriteLine(e));//抛出异常
引发的异常是“对象必须是Int32类型。”

如何编写Linq对这样的列表进行排序。

list list=new list(){11.21323,43221,2,“asd”};
List<object> list = new List<object>() { 11.21, 323, 4, 3221, 221, 2, "asd" };
var qu = list.OrderBy((o) => o.ToString());
qu.ToList().ForEach((e) => Console.WriteLine(e));
var qu=list.OrderBy((o)=>o.ToString()); qu.ToList().ForEach((e)=>Console.WriteLine(e));

您必须将项目强制转换为某些内容,而不一定是int。在本例中,我将所有内容强制转换为string。请记住,OrderBy操作将按字符串排序,当然不是按数字排序。您无法进行数字排序,因为列表中有一个字符串项。

这是我写过的最疯狂的LINQ查询之一

var qu = list.Select(x =>
                        {
                            decimal? d;
                            try
                            {
                                d = Convert.ToDecimal(x);
                            }
                            catch (FormatException)
                            {
                                d = null;
                            }

                            return new { v = x, d, s = x.ToString() };
                        }).GroupBy(x => x.d.HasValue)
                          .Select(g =>
                              g.Key
                              ? g.OrderBy(x => x.d.Value).Select(x => x.v)
                              : g.OrderBy(x => x.s).Select(x => x.v))
                          .SelectMany(x => x)
                          .ToList();

首先返回所有数值(使用其值排序),然后返回使用标准字符串比较排序的所有字符串。

我将使用自定义比较器:

o = o.OrderBy(x => x, new MyComparer());

内部类CustomComparer:IComparer
{
公共整数比较(对象x、对象y)
{
if(x是字符串&&y是字符串)
{
返回((字符串)x),比较((字符串)y);
}
else if(x是字符串&&IsNumber(y))
{
返回-1;
}
else if(y是字符串&&IsNumber(x))
{
返回1;
}
否则如果(IsNumber(x)和IsNumber(y))
{
return(Convert.ToDouble(x)).CompareTo(Convert.ToDouble(y));
}
其他的
{
抛出新的NotSupportedException();
}
}
私有布尔IsNumber(对象o)
{
var t=o.GetType();
如果(o是int | | o是double | | o是float | | o是long)
返回true;
返回false;
}
}

像这样实现
IComparer
怎么样

public class MyComparer : IComparer<object>
{
    public int Compare(object x, object y)
    {
        var type = x.GetType();
        var type2 = y.GetType();
        if (type == typeof(string) && type2 == typeof(string))
        {
            return String.Compare((string)x, (string)y);
        }
        else if (type.IsValueType && type2.IsValueType)
        {
            var comp = Comparer<double>.Default;
            return comp.Compare(Convert.ToDouble(x), Convert.ToDouble(y));
        }
        else
        {
            return 0;
        }
    }
}
公共类MyComparer:IComparer
{
公共整数比较(对象x、对象y)
{
var type=x.GetType();
var type2=y.GetType();
if(type==typeof(string)和&type2==typeof(string))
{
返回字符串。比较((字符串)x,(字符串)y);
}
else if(type.IsValueType&&type2.IsValueType)
{
var comp=比较器默认值;
返回comp.Compare(Convert.ToDouble(x),Convert.ToDouble(y));
}
其他的
{
返回0;
}
}
}
并使用它:

List<object> list = new List<object>() { 11.21, 323, 4, 3221, 221, 2, "asd" };
var qu = list.OrderBy(o => o, new MyComparer());
qu.ToList().ForEach((e) => Console.WriteLine(e));
List List=newlist(){11.21323432212,“asd”};
var qu=list.OrderBy(o=>o,new MyComparer());
qu.ToList().ForEach((e)=>Console.WriteLine(e));

您想如何对不同类型的项目进行排序?!哪个先到:
11.21
还是
asd
?!你如何决定订单?我更喜欢将字符串排序在一起,并将双浮点int排序在一起。然后编写自己的comparer@DJ不,这里没有内置内容,因为将
int
s、
decimal
s和
string
s一起比较真的很奇怪。特别是比较哪一个更低,哪一个大于另一个。它不会使用数字比较来排序数字项。是的,我提到过。你测试过吗?使用强制转换将装箱的
int
解装箱为
double
将不起作用。
List<object> list = new List<object>() { 11.21, 323, 4, 3221, 221, 2, "asd" };
var qu = list.OrderBy(o => o, new MyComparer());
qu.ToList().ForEach((e) => Console.WriteLine(e));