我有 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/