我有一堆不同颜色的拾取棒,我想删除重复的颜色,按颜色排序,每种颜色最短,最长。
这是我的部分代码:
StickStack stickstack = new StickStack();
List<Stick> noDupeSticks = stickstack.Pile
.GroupBy(st => new { st.LengthInCm, st.ColorBlue, st.ColorGreen, st.ColorRed })
.Select(st => st.FirstOrDefault()).ToList();
var blueSticks = noDupeSticks
.OrderBy(s => s.LengthInCm)
.Where(s => s.LengthInCm >= 5.0m && s.LengthInCm <= 20.0m && s.ColorBlue >= s.ColorGreen && s.ColorBlue >= s.ColorRed)
.Select(s => new Stick(s.LengthInCm, s.ColorRed, s.ColorGreen, s.ColorBlue));
var greenSticks = noDupeSticks
.OrderBy(s => s.LengthInCm)
.Where(s => s.LengthInCm >= 5.0m && s.LengthInCm <= 20.0m && s.ColorGreen >= s.ColorBlue && s.ColorGreen >= s.ColorRed)
.Select(s => new Stick((decimal)s.LengthInCm, s.ColorRed, s.ColorGreen, s.ColorBlue));
SortByColorResult result = new SortByColorResult();
result.Blues = blueSticks.ToList();
result.Greens = greenSticks.ToList();
实例化StickStack会创建一堆List<Stick>
一堆棍棒。
不幸的是,在所有这些中,LengthInCm值(范围从5.0m到20.0m)都是5。
有人知道这里有什么问题吗?
编辑回应评论: 这是Stick类:
public class Stick
{
public decimal LengthInCm { get; private set; }
public int ColorRed { get; private set; }
public int ColorGreen { get; private set; }
public int ColorBlue { get; private set; }
public Stick(
decimal lengthInCm,
int colorRed,
int colorGreen,
int colorBlue)
{
LengthInCm = lengthInCm;
ColorRed = colorRed;
ColorGreen = colorGreen;
ColorBlue = colorBlue;
}
}
如您所见,LengthInCm是小数;其余的字段都是int。另外,评论中有人问为什么我的分拣程序例程明确地将长度值转换为十进制。这只是我试图使LengthInCm显示为小数而不是5的数字之一。
一些示例棒是:
stick1 = new Stick(10.00m, 256, 128, 50);
stick2 = new Stick(10.00m, 256, 128, 50);
stick3 = new Stick(20.00m, 128, 50, 256);
正如我之前提到的实例化Stickstack,创建了一个介于200万到500万条记录之间的桩(List)。
每条记录的LengthInCm是5.0到20.0之间的随机小数。
希望这有帮助。
编辑:添加桩创建代码:
for (int i = 0; i < size; i++)
{
_pile.Add(
new Straw(
generator.Next(LENGTH_MIN, LENGTH_MAX) / (decimal)10,
generator.Next(COLOR_MIN, COLOR_MAX),
generator.Next(COLOR_MIN, COLOR_MAX),
generator.Next(COLOR_MIN, COLOR_MAX)
));
}
另外,所以你会知道常数是什么:
private const int PILE_SIZE_MIN = 2000000;
private const int PILE_SIZE_MAX = 3000000;
private const int COLOR_MIN = 0;
private const int COLOR_MAX = 256;
private const int LENGTH_MIN = 50;
private const int LENGTH_MAX = 200;
并且,因为有人会问,这是第一个LINQ语句之后的输出(删除了dupes的列表)。
不知道还能告诉你什么。创建noDupeSticks的查询显然具有增加的LengthInCm的十进制值,但是创建蓝色子集的查询仅为LengthInCm返回5。
感谢。