c# - 根据值对 3 个列表进行排序

标签 c# .net algorithm

我有 3 个列表,其中包含任意数量的 double 。现在我想将这个列表相互比较并对它们进行排序。所有列表的长度都相同。

排序关系为:

比较每个元素。具有更多元素的列表随着另一个元素的增加而排序更高。我为两个列表编写了一个实现:

public static bool isGreater(List<double> first, List<double> second)
        {
            int firstCounter = 0;
            int secondCounter = 0;

            for (int i = 0; i < first.Count; i++)
            {
                if (first.ElementAt(i) > second.ElementAt(i))
                {
                    firstCounter++;
                }
                else if (first.ElementAt(i) < second.ElementAt(i))
                {
                    secondCounter++;
                }
            }

            if (firstCounter > secondCounter)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

但我该如何调整此代码以适用于 3 个甚至 n 个列表?

最佳答案

您应该能够使用 LINQ 和针对 IEnumerable<double> 的自定义 IComparer 来执行此操作.

public class EnumerableDoubleComparer : IComparer<IEnumerable<double>>
{
    public int Compare( IEnumerable<double> a, IEnumerable<double> b )
    {
        var counts = a.Select( (k,i) => new { Value = k, Index = i } )
                      .Join( b.Select( (k,i) => new { Value = k, Index = i } ),
                             outer => outer.Index,
                             inner => inner.Index,
                             (outer,inner) => outer.Value > inner.Value
                                                  ? "A"
                                                  : (inner.Value > outer.Value
                                                        ? "B"
                                                        : "" ) )
                      .GroupBy( listID => listID )
                      .Select( g => new { g.Key, Count = g.Count() } );

        // you could also use SingleOrDefault on the collection and check for null
        var aCount = counts.Where( c => c.Key == "A" )
                           .Select( c => c.Count )
                           .SingleOrDefault();
        var bCount = counts.Where( c => c.Key == "B" )
                           .Select( c => c.Count )
                           .SingleOrDefault();

        return aCount - bCount;
    }
}

用作:

var a = new double[] { 1, 1 };
var b = new double[] { 2, 2 };
var c = new double[] { 3, 3 };

var lists = new List<IEnumerable<double>> { a, c, b };

var ordered = lists.OrderByDescending( l => l, new EnumerableDoubleComparer() );

关于c# - 根据值对 3 个列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4618285/

相关文章:

c# - 如何跨窗口传递变量,以便它可以在每个窗口中使用,或者只是使其对我的整个程序可见?

c# - 使用 DllImport 将非托管 dll 加载到托管应用程序中

.net - 无法安装nuget包; DNXCore 依赖关系困惑

c# - 使用 C# 发送邮件,使用客户端发送 Lotus Notes

algorithm - 如何创建没有两首连续歌曲在同一调中的轨道列表

algorithm - 表示具有 3 个操作的二值数组的数据结构

c# - WebRequest 与 FileWebRequest

c# - 如何使用 C# 和 ImageMagick 将 PDF 转换为图像?

algorithm - 为什么分治矩阵乘法算法中的递归步骤是8T(n/2)而不是8T(n/4)

c# - JSON反序列化,错误: null to value type,如何知道导致错误的确切属性?