2011-11-24 83 views
-5

如何控制元组重复循环?元组限制

有人给了我一个算法的提示,我已经修改了一点。

int LimCol = Convert.ToInt32(LimitColis); 

result = oListTUP 
     .GroupBy(x => x.Item1) 
     .Select(g => new 
     { 
      Key = g.Key, 
      Sum = g.Sum(x => x.Item2), 
      Poids = g.Sum(x => x.Item3), 
     }) 
     .Select(p => new 
     { 
      Key = p.Key, 
      Items = Enumerable.Repeat(LimCol , p.Sum/LimCol).Concat(Enumerable.Repeat(p.Sum % LimCol, 1)), 
      CalculPoids = p.Poids/(Enumerable.Repeat(LimCol, p.Sum/LimCol).Concat(Enumerable.Repeat(p.Sum % LimCol, 1))).Count() 
     }) 
     .SelectMany(p => p.Items.Select(i => Tuple.Create(p.Key, i, p.CalculPoids))) 
         .ToList(); 

foreach (var oItem in result) 
{ 
    Label1.Text += oItem.Item1 + "--" + oItem.Item2 + "--" + oItem.Item3 + "<br>"; 
} 

与LimCol = 3 ScreenShot

正如你所看到的,我的有色红色问题的结果。

PS:我已经创造了一些元组不使用来自SQL

数据
var list = new List<Tuple<string, int, decimal>> 
     { 
      Tuple.Create("0452632", 12, 15.0m), 
      Tuple.Create("essai 49", 1, 45.0m), 
      Tuple.Create("essai 49", 1, 45.0m), 
      Tuple.Create("essai 49", 2, 45.0m), 
      Tuple.Create("essai 49", 1, 23.0m), 


     }; 

     int TheLimCol = 3; 

     var Theresult = list 
      .GroupBy(x => x.Item1) 
      .Select(g => new 
      { 
       Key = g.Key, 
       Sum = g.Sum(x => x.Item2), 
       Poids = g.Sum(x => x.Item3), 
      }) 
      .Select(p => new 
      { 
       Key = p.Key, 
       Items = Enumerable.Repeat(TheLimCol, p.Sum/TheLimCol).Concat(Enumerable.Repeat(p.Sum % TheLimCol, 1)), 

       CalculPoids = p.Poids/(Enumerable.Repeat(TheLimCol, p.Sum/TheLimCol).Concat(Enumerable.Repeat(p.Sum % TheLimCol, 1))).Count() 

      }) 
      .SelectMany(p => p.Items.Select(i => Tuple.Create(p.Key, i, p.CalculPoids))) 
      .ToList(); 

     foreach (var oItem in Theresult) 
     { 
      Label1.Text += oItem.Item1 + "--" + oItem.Item2 + "--" + oItem.Item3 + "<br>"; 
     } 

实际输出:

0452632--3--3,0 
0452632--3--3,0 
0452632--3--3,0 
0452632--3--3,0 
0452632--0--3,0 
essai 49--3--79,0 
essai 49--2--79,0 

预期的结果:

0452632--3--3,75 
0452632--3--3,75 
0452632--3--3,75 
0452632--3--3,75 
essai 49--3--79,00 
essai 49--2--79,00 
+3

你的问题是什么?一点也不清楚。 – Oded

+0

问题可能出现在“Enumerable.Repeat(LimCol,p.Sum/LimCol)”(舍入问题?)中,但是您没有提供足够的信息。 LimitColis的价值在哪里? oListTUP中的Item2属性的值是什么? –

+0

感谢您的回复,我现在添加了tupel示例 – user609511

回答

1

的问题是在你的“ .Concat(Enumerable.Repeat(p.Sum%TheLimCol,1)“)。即使余数(p.Sum%TheLimCo升)等于0

这应该工作:

 var result = list 
      .GroupBy(x => x.Item1) 
      .Select(g => new 
      { 
       Key = g.Key, 
       Sum = g.Sum(x => x.Item2), 
       Poids = g.Sum(x => x.Item3), 
      }) 
      .Select(p => new 
      { 
       Key = p.Key, 
       Items = Enumerable.Repeat(limCol, p.Sum/limCol).Concat(Enumerable.Repeat(p.Sum % limCol, p.Sum % limCol > 0 ? 1 : 0)), 
       CalculPoids = p.Poids/Enumerable.Repeat(limCol, p.Sum/limCol).Concat(Enumerable.Repeat(p.Sum % limCol, 1)).Count() 
      }) 
      .SelectMany(p => p.Items.Select(i => Tuple.Create(p.Key, i, p.CalculPoids))) 
      .ToList(); 

在该特定情况下,我建议使用LINQ的替换语法(或不使用LINQ在所有):

 var query = from x in list 
        group x by x.Item1 into g 
        let sum = g.Sum(x => x.Item2) 
        let poids = g.Sum(x => x.Item3) 
        let remainder = sum % limCol 
        let items = Enumerable.Repeat(limCol, sum/limCol).Concat(Enumerable.Repeat(remainder, remainder > 0 ? 1 : 0)) 
        select new 
        { 
         Key = g.Key, 
         Items = items, 
         CalculPoids = poids/items.Count() 
        }; 


     var result = query.SelectMany(p => p.Items.Select(i => Tuple.Create(p.Key, i, p.CalculPoids)));