未知集合返回连续的 三个数

qq_16366149 2016-12-16 11:29:49
未知集合:list 有连个字段 month , amount 该集合month 的值介于 1~12 不会重复,要求:返回连续的三个month 值,如果连续的值大于3个 根据amount 求SUM 根据SUM 值排序 返回 最大的前三个
...全文
398 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
白衣如花 2016-12-19
  • 打赏
  • 举报
回复
引用 10 楼 qq_16366149 的回复:
那更好办,月份是排序的,且不会重复,直接用当前项-2的月份是否是当前月份-2就能判断是否连续了。。。代码如下:
int sum = 0;
for (int i = 2; i < list.length; i++)
{
    if (list[i].month - 2 == list[i - 2].month)
    {
        int currentSum = list[i - 2].amount + list[i - 1].amount + list[i].amount;
        if (currentSum > sum)
            sum = currentSum;
    }
}
wanghui0380 2016-12-19
  • 打赏
  • 举报
回复
我4楼就是基本思路,看明白你自己改。 至于你说东西不确定,我只能说你要么外面包装一下形成统一接口,要么委托一下让调用者自己确定。 func<T,int> 外面调用滴自己告诉我怎么从T实例里找到一个int的month
qq_16366149 2016-12-19
  • 打赏
  • 举报
回复
引用 9 楼 u012948520 的回复:
一把梳,梳过去 currentMonth,当前月 currentSum,当前和 sum,最后的和 repeatCount当前月重复次数

int currentMonth = -1;
int currentSum = 0;
int sum = 0;
int repeatCount = 0;
for (int i = 0; i < list.count; i++)
{
    var obj = list[i];
    if (currentMonth == obj.month)
    {
        repeatCount++;
        currentSum += obj.amount;
        if (repeatCount >= 3 && currentSum > sum)
            sum = currentSum;
    }
    else
    {
        currentMonth = obj.month;
        repeatCount = 1;
        currentSum = obj.amount;
    }
}
//sum就是最后的结果了,要三个就把sum定义成int[3],一样的处理
你好 你的解决方案不能满足我的需求,麻烦您了! 是这样,关于list,里面的两个字段month(月份),amount(总金额), month的范围是1~12,不会重复,现在的需求是:判断客户的投资是否是连续的3个月,如果是 就返回 每个月的月份 还有就是sum(amount)投资总额,可以返回成字符串,当然月份跟总金额拼接成字符串的时候,我在分割的时候最好能分割开,如果连续投资大于三个月, 比如: List<MyClass> lst = new List<MyClass>(); lst.Add(new MyClass() { month = 1, amount = 1 }); lst.Add(new MyClass() { month = 2, amount = 2 }); lst.Add(new MyClass() { month = 3, amount =3}); lst.Add(new MyClass() { month = 4, amount = 4 }); lst.Add(new MyClass() { month = 7, amount = 1}); lst.Add(new MyClass() { month = 8, amount = 1 }); lst.Add(new MyClass() { month = 9, amount = 1 }); 这个集合现在1~4月份是连续投资,7~9月份也是连续投资,但是在算的过程中,1月 2月 3月 投资总额是6,2月 3月 4月 的投资总额是8,7 月8月9月的投资总额是3,所以返回的是2月 3月 4月及投资总额8,如果是连续5个月或者以上,就是按照以上的方式,算出其中连续三个月的投资总额的最大数,并且把相应的月份返回。
白衣如花 2016-12-19
  • 打赏
  • 举报
回复
一把梳,梳过去 currentMonth,当前月 currentSum,当前和 sum,最后的和 repeatCount当前月重复次数

int currentMonth = -1;
int currentSum = 0;
int sum = 0;
int repeatCount = 0;
for (int i = 0; i < list.count; i++)
{
    var obj = list[i];
    if (currentMonth == obj.month)
    {
        repeatCount++;
        currentSum += obj.amount;
        if (repeatCount >= 3 && currentSum > sum)
            sum = currentSum;
    }
    else
    {
        currentMonth = obj.month;
        repeatCount = 1;
        currentSum = obj.amount;
    }
}
//sum就是最后的结果了,要三个就把sum定义成int[3],一样的处理
xuzuning 2016-12-19
  • 打赏
  • 举报
回复
        static void Main(string[] args)
{
List<MyClass> lst = new List<MyClass>();
lst.Add(new MyClass() { month = 1, amount = 1 });
lst.Add(new MyClass() { month = 2, amount = 2 });
lst.Add(new MyClass() { month = 3, amount = 3 });
lst.Add(new MyClass() { month = 4, amount = 4 });
lst.Add(new MyClass() { month = 7, amount = 1 });
lst.Add(new MyClass() { month = 8, amount = 1 });
lst.Add(new MyClass() { month = 9, amount = 1 });

var query = from a in lst
from b in lst
from c in lst
where a.month == b.month - 1 && a.month == c.month - 2
orderby a.amount + b.amount + c.amount descending
select new
{
month = a.month + "," + b.month + "," + c.month,
amount = a.amount + b.amount + c.amount
};
foreach (var x in query) Console.WriteLine("{0} {1}", x.month, x.amount);
}
class MyClass
{
public int month { get; set; }
public int amount { get; set; }
}


本来是该在数据库里完成的
qq_16366149 2016-12-18
  • 打赏
  • 举报
回复
[quote=引用 6 楼 wanghui0380 的回复:] 大神因为ilist里面的值是从数据库动态取的,所有集合内部的值不确定。期待你的解决方案
qq_16366149 2016-12-18
  • 打赏
  • 举报
回复
[quote=引用 3 楼 johnliuyuan 的回复:] 是这样,关于list,里面的两个字段month(月份),amount(总金额), month的范围是1~12,不会重复,现在的需求是:判断客户的投资是否是连续的3个月,如果是 就返回 每个月的月份 还有就是sum(amount)投资总额,可以返回成字符串,当然月份跟总金额拼接成字符串的时候,我在分割的时候最好能分割开,如果连续投资大于三个月, 比如: List<MyClass> lst = new List<MyClass>(); lst.Add(new MyClass() { month = 1, amount = 1 }); lst.Add(new MyClass() { month = 2, amount = 2 }); lst.Add(new MyClass() { month = 3, amount =3}); lst.Add(new MyClass() { month = 4, amount = 4 }); lst.Add(new MyClass() { month = 7, amount = 1}); lst.Add(new MyClass() { month = 8, amount = 1 }); lst.Add(new MyClass() { month = 9, amount = 1 }); 这个集合现在1~4月份是连续投资,7~9月份也是连续投资,但是在算的过程中,1月 2月 3月 投资总额是6,2月 3月 4月 的投资总额是8,7 月8月9月的投资总额是3,所以返回的是2月 3月 4月及投资总额8,如果是连续5个月或者以上,就是按照以上的方式,算出其中连续三个月的投资总额的最大数,并且把相应的月份返回。
  • 打赏
  • 举报
回复
根据amount 求SUM 根据SUM 值排序 根本没看懂这是怎么个sum法
我不懂电脑 2016-12-16
  • 打赏
  • 举报
回复
按这个逻辑编代码就可以了啊。
wanghui0380 2016-12-16
  • 打赏
  • 举报
回复
ps:上面b的res属性就是,连续,个数大于3,并且sum amout值最大的列表,当然这个题目实在描述的不清不楚,我个人只能这样理解
wanghui0380 2016-12-16
  • 打赏
  • 举报
回复
题目描述比较模糊,只能完成大概意思,尤其是最后一句话“根据SUM 值排序 返回 最大的前三个 ”,上下文太难理解了,只能姑且认为,条件为,month连续,并且大于3个,同时sum amout最大
wanghui0380 2016-12-16
  • 打赏
  • 举报
回复
并不清楚具体玩意,不过按个人理解玩一个,1,2,3连续不过amcout小,7,8,9连续amout大选择7,8,9

   static void Main(string[] args)
        {
            List<MyClass> lst = new List<MyClass>();

            lst.Add(new MyClass() { month = 3, amount = 1 });
            lst.Add(new MyClass() { month = 1, amount = 3 });
            lst.Add(new MyClass() { month = 2, amount =4 });
            lst.Add(new MyClass() { month = 5, amount = 4 });
            lst.Add(new MyClass() { month = 7, amount = 4 });
            lst.Add(new MyClass() { month = 8, amount = 4 });
            lst.Add(new MyClass() { month = 9, amount = 4 });



            int i = 0;
            var orderlst = lst.OrderBy(p => p.month);

          var b=  orderlst.Aggregate(new temp(), (temp, v) =>
            {

                if(temp.tempvalue.HasValue)
                {                  
                   if (v.month - temp.tempvalue == 1)
                    {
                        temp.tempvalue = v.month;
                        temp.lstfirst.Add(v);
                        if (temp.lstfirst.Count() >= 3)
                        {
                            if (temp.lstfirst.Sum(p => p.amount) >= temp.res.Sum(p => p.amount))
                            {
                                temp.res = new List<MyClass>(temp.lstfirst);
                            }
                        }
                    }
                   else
                   {
                       temp.tempvalue = v.month;
                       temp.lstfirst.Clear();
                       temp.lstfirst.Add(v);

                   }

                }
                else
                {
                    temp.tempvalue = v.month;
                    temp.lstfirst.Add(v);
                }

                return temp;
            });

         
           
         
            
        }

        public class temp
        {

            public int? tempvalue { get; set; }
            public List<MyClass> lstfirst { get; set; }

            public List<MyClass> res { get; set; }

            public temp()
            {
                lstfirst = new List<MyClass>();
                res = new List<MyClass>();
            }

        }

        internal class MyClass
        {

            public int month { get; set; }
            public int amount { get; set; }
        }
john_QQ:2335298917 2016-12-16
  • 打赏
  • 举报
回复
没看懂,太深奥了

110,538

社区成员

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

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

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