2011-11-24 25 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)));