【求助】求一个思路:泛型类的使用,详细里面说。

技术型萨达哈鲁 2013-01-18 10:07:26
要求:R类中有字段: 编号 数量 C类中有字段 编号 数量
Dt01 5 A1 2
Dt02 5 A2 4
A3 4
然后用R类中的数量拆一下给C,结果为: 编号 来源 数量
A1 Dt01 2
A2 Dt01 3
A3 Dt02 1
A4 Dt02 4
应该够明显了吧,问题是:
1、R类中的数量和C类中的数量是可变的可以是R(4,3,6,32,23)C中(6,35,2,3,1,2,3,16)但是可以确定
的一点是:R中的数量之和 == C中的数量之和。
2、要用类的方法,泛型类的方法来做,不可以用DataTable或者数组的思想。【这是最重要的约束】

请问大神们应该怎么做呢?
...全文
132 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
phommy 2013-01-18
  • 打赏
  • 举报
回复
1.声明数组,数组的元素类型和长度由编译器根据{}中的内容自动判断 2.yield return关键字,百度吧 3.匿名类型,同上百度吧 4.还是yield的用法,没有存在什么地方,生成一个返回一个。明白2就明白了
  • 打赏
  • 举报
回复
引用 5 楼 phommy 的回复:
结果: { 编号 = A1, 来源 = Dt01, 数量 = 2 } { 编号 = A2, 来源 = Dt01, 数量 = 3 } { 编号 = A2, 来源 = Dt02, 数量 = 1 } { 编号 = A3, 来源 = Dt02, 数量 = 4 } 请按任意键继续. . . 目测你的演示结果后两行是错的,我按我的理解做的。 C# code?12……
请问你一下啊,有几个地方看不明白: 1、 var r = new[] { new { 编号 = "Dt01", 数量 = 5 }, new { 编号 = "Dt02", 数量 = 5 }, }.ToList(); 这个var r = new[]{}是什么用法吗?以前没见过啊。 2、yield return new是什么意思?有什么用吗? 3、 enumC.Current.编号, 来源 = enumR.Current.编号, 数量 = cRemain 怎么直接等于了“来源”“数量”这样子的汉字啊? 4、最重要的:那个你把最后的结果那个集合假设取个名字叫Result吧,那么Result(编号 来源 数量)你是存放在什么地方?我遍历什么可以得到这个集合里的东西? 本人菜鸟,初学不久,就几个月,请别介意啊,这里我真心不懂,请教了您了~!
  • 打赏
  • 举报
回复
引用 5 楼 phommy 的回复:
结果: { 编号 = A1, 来源 = Dt01, 数量 = 2 } { 编号 = A2, 来源 = Dt01, 数量 = 3 } { 编号 = A2, 来源 = Dt02, 数量 = 1 } { 编号 = A3, 来源 = Dt02, 数量 = 4 } 请按任意键继续. . . 目测你的演示结果后两行是错的,我按我的理解做的。 C# code?12……
非常感谢,大神啊!!!!阿利亚多苦度一马斯!
phommy 2013-01-18
  • 打赏
  • 举报
回复
结果: { 编号 = A1, 来源 = Dt01, 数量 = 2 } { 编号 = A2, 来源 = Dt01, 数量 = 3 } { 编号 = A2, 来源 = Dt02, 数量 = 1 } { 编号 = A3, 来源 = Dt02, 数量 = 4 } 请按任意键继续. . . 目测你的演示结果后两行是错的,我按我的理解做的。
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (var item in GetValue())
            {
                Console.WriteLine(item.ToString());
            }
        }

        static IEnumerable<object> GetValue()
        {
            //初始化r,c,既然你需要用泛型,那就把输入toList一下
            var r = new[]
                    {
                        new
                        {
                            编号 = "Dt01",
                            数量 = 5
                        },
                        new
                        {
                            编号 = "Dt02",
                            数量 = 5
                        },
                    }.ToList();
            var c = new[]
                    {
                        new
                        {
                            编号 = "A1",
                            数量 = 2
                        },
                        new
                        {
                            编号 = "A2",
                            数量 = 4
                        },
                        new
                        {
                            编号 = "A3",
                            数量 = 4
                        },
                    }.ToList();

            //下边是计算
            var enumR = r.GetEnumerator();
            var enumC = c.GetEnumerator();

            if (!enumR.MoveNext() || !enumC.MoveNext())
            {
                yield break;
            }

            var rRemain = enumR.Current.数量; //记录集合r中的未分配数量
            var cRemain = enumC.Current.数量;

            while (enumR.Current != null)
            {
                if (rRemain > cRemain)
                {
                    yield return new
                                 {
                                     enumC.Current.编号,
                                     来源 = enumR.Current.编号,
                                     数量 = cRemain
                                 };

                    rRemain -= cRemain;
                    enumC.MoveNext();
                    cRemain = enumC.Current.数量;
                }
                else if (rRemain < cRemain)
                {
                    yield return new
                                 {
                                     enumC.Current.编号,
                                     来源 = enumR.Current.编号,
                                     数量 = rRemain
                                 };

                    cRemain -= rRemain;
                    enumR.MoveNext();
                    rRemain = enumR.Current.数量;
                }
                else
                {
                    yield return new
                                 {
                                     enumC.Current.编号,
                                     来源 = enumR.Current.编号,
                                     数量 = rRemain
                                 };

                    cRemain = rRemain = 0;
                    enumR.MoveNext();
                    enumC.MoveNext();
                }
            }
        }
    }
}
  • 打赏
  • 举报
回复
引用 1 楼 lye2000000_super 的回复:
两个类除了数量和相等外没有关联了就?
我直白的说就是说R是一个大工厂,假设(不固定啊,只是个例子)有3个仓库,一个仓库里有10吨货物,一个仓库里有8吨货物,一个仓库里有2吨货物,共20吨货物。然后C就是一个需求的超市,假设(不固定啊,只是个例子)有四层楼,第一层楼要3吨货物,第二层要14吨货物,第三层要2吨货物,第四层要1吨货物。那么要配货了啊,把R的货物一个仓库一个仓库,每个仓库打上自己的编号给C超市,怎么分配随你,但要保证每层收到R的货物与其所需要的数量相等,而且注明每层有多少来自R工厂的那个仓库。要求:不用DataTable和数组的思想,用泛型类的思想。我是一点思路都没有啊,不过用DataTable我已经成功做出来的,可是不可以用这种方法,OK,你懂了吧?
  • 打赏
  • 举报
回复
引用 2 楼 hjywyj 的回复:
没看出什么来。为什么是2314呢?1234也说不定
可以的,这只是个例子,就是说从R中把数据拆分开来给C,至于R中哪一个字段拆分几个就不管了
  • 打赏
  • 举报
回复
没看出什么来。为什么是2314呢?1234也说不定
  • 打赏
  • 举报
回复
两个类除了数量和相等外没有关联了就?

110,538

社区成员

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

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

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