C# 小问题

kingdom_0 2012-04-24 08:55:34
有这样一组数据:
T V
1 5
2 5
3 4
4 6
。。。(列数不定)
其中,列 V 的数值总和假定为 _sum,一个随机数Temp,一个处理结果_result,其中Temp<_sum,
现在从第一条数据开始处理,如果V的累加值>Temp,结束处理,假如Temp=3,则处理到第一条数据便停止,假如Temp=10,则到第二条数据停止
想要的结果数据:
如果Temp=4:_result=1,1;
如果Temp=8:_result=1,0;2,2;
如果Temp=11:_result=1,0;2,0;3,3;
其中,_result是一个字符串.
...全文
165 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingdom_0 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

C# code
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(str……
[/Quote]
这种方式是可以的。
kingdom_0 2012-04-25
  • 打赏
  • 举报
回复
例如Temp=5.
kingdom_0 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

C# code
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(str……
[/Quote]
感谢版主。。
不过我发现个问题,要是Temp的值=V的值的时候,结果有点问题。
test2050 2012-04-24
  • 打赏
  • 举报
回复
这个算法是应用于哪里的?
threenewbee 2012-04-24
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
int[] data1 = { 1, 5, 2, 5, 3, 4, 4, 6 };
dt.Columns.AddRange(new DataColumn[] { new DataColumn("T"), new DataColumn("V") });
for (int i = 0; i < data1.Length / 2; i++)
{
var r = dt.NewRow();
r["T"] = data1[i * 2];
r["V"] = data1[i * 2 + 1];
dt.Rows.Add(r);
}
int temp = 4; // 8, 11
if (dt.Rows.Cast<DataRow>().Sum(x => Convert.ToInt32(x["V"])) < temp)
throw new Exception("数据不够 temp");
var data = dt.Rows.Cast<DataRow>()
.Select(x => new { T = Convert.ToInt32(x["T"]), V = Convert.ToInt32(x["V"]) })
.Select(x => {
if (x.V >= temp)
{
return new { T = x.T, V = x.V - temp };
}
else
{
temp -= x.V;
return new { T = x.T, V = 0 };
}
}).ToList();
var result = string.Join("; ", data.Take(data.Select((x, i) => new { x.V, i }).First(x => x.V != 0 || x.i == dt.Rows.Count - 1).i + 1).Select(x => x.T + ", " + x.V)) + ";";
Console.WriteLine(result);
}
}
}
threenewbee 2012-04-24
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
int[] data = { 1, 5, 2, 5, 3, 4, 4, 6 };
dt.Columns.AddRange(new DataColumn[]
{ new DataColumn("T"), new DataColumn("V") });
for (int i = 0; i < data.Length / 2; i++)
{
var r = dt.NewRow();
r["T"] = data[i * 2];
r["V"] = data[i * 2 + 1];
dt.Rows.Add(r);
}
int temp = 4; // 8, 11
int v = 0;
int index = 0;
for (int i = -1; i < dt.Rows.Count - 1; i++)
{
v += i == -1 ? 0 : Convert.ToInt32(dt.Rows[i]["V"]);
if (v + Convert.ToInt32(dt.Rows[i + 1]["V"]) >= temp)
{
index = i;
v = v + Convert.ToInt32(dt.Rows[i + 1]["V"]) - temp;
goto label1;
}
}
index = dt.Rows.Count - 2;
v = v + Convert.ToInt32(dt.Rows[dt.Rows.Count - 1]["V"]) - temp;
label1:
string result = string.Join("; ", dt.Rows.Cast<DataRow>().Take(index + 1).
Select(x => x["T"] + ", " + "0"))
+ (index == -1 ? "" : "; ") + dt.Rows[index + 1]["T"] + ", " + v + ";";
Console.WriteLine(result);
}
}
}
anzhiqiang_touzi 2012-04-24
  • 打赏
  • 举报
回复
没明白
kingdom_0 2012-04-24
  • 打赏
  • 举报
回复
我自己实现出来一个笨办法,自己都看不上。。
kingdom_0 2012-04-24
  • 打赏
  • 举报
回复
之后,将前N条数据的两列用','分割开,没行数据用‘;’分割开,之后拼接成一个字符串,想要的就是这个串
如下:
如果Temp=4:_result=1,1;
如果Temp=8:_result=1,0;2,2;
如果Temp=11:_result=1,0;2,0;3,3;
threenewbee 2012-04-24
  • 打赏
  • 举报
回复
明白了。
kingdom_0 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:

呵呵。
..别笑。。
赶紧帮忙!
[/Quote]
一个数据集,从第一条数据开始遍历,遍历到第N条,如果前N-1条数据总和SUM(V)<Temp&&前N条数据总和SUM(V)>=Temp,停止遍历。前N-1条数据的V列数据全部更改为0,第N条数据的V值更改为前N条数据总和减去Temp值
kingdom_0 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

呵呵。
[/Quote]..别笑。。
赶紧帮忙!
threenewbee 2012-04-24
  • 打赏
  • 举报
回复
没看懂什么意思

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧