加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,To

发布时间:2020-12-15 04:40:27 所属栏目:百科 来源:网络整理
导读:这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary 和ToLookup。 从图中我们看到有四个ToXXX的方法,其中ToArray和ToList,我想大家用的是非常非常多,但是ToDictionary和ToLookup 不见得

  这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary

和ToLookup。

  从图中我们看到有四个ToXXX的方法,其中ToArray和ToList,我想大家用的是非常非常多,但是ToDictionary和ToLookup

不见得有多少人用了,但不能否认的是这些方法确实很有用。

???? 不多废话了,直接如主题,我们有这样的一个实体,包含:票号,订单号,备注。

TicketNo { ; </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 订单号 </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span> OrderID { <span style="color: #0000ff;"&gt;get</span>; <span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;; } </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span> <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 备注 </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span> <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;string</span> Description { <span style="color: #0000ff;"&gt;get</span>; <span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;; } }</span></pre>

好了,我们看看需求,票号和订单号是一对多的关系,也就是说一个订单号可能包含几个票号,每个票号都有自己对应的状态,

比如票号有 “改签”,"未使用",“成交”,"退票" 等等,下面我们灌一批数据进去。

List List Ticket(){ TicketNo=,OrderID=,Description= Ticket(){ TicketNo=,OrderID=,Description= Ticket(){ TicketNo=,OrderID=,Description= Ticket(){ TicketNo=,OrderID=,Description= Ticket(){ TicketNo=, Ticket(){ TicketNo=, Ticket(){ TicketNo=, Ticket(){ TicketNo=, Ticket(){ TicketNo=,OrderID=, Ticket(){ TicketNo=,OrderID=,Description=

举个例子:?我需要统计各个订单号中的票号情况。

  

????? 很明显,这是一个分组排序的问题,可能你马上就想起了groupby来实现,当然groupby是可以实现的,不过groupby不能算是一种数据

结构,不能带有索引,没有字典那样容易输出和操作。

方案一: 采用普通的foreach循环。

?????????????一般情况下,可能有一部分人都采用这种原始的方法,将list数据通过foreach循环放到dictionary中,就是代码写的多一些,也算

是最灵活的。

<div class="cnblogs_code">

            Dictionary<,Ticket> dic =  Dictionary<,Ticket>        </span><span style="color: #0000ff;"&gt;foreach</span> (<span style="color: #0000ff;"&gt;var</span> item <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; ticketlist)
        {
            </span><span style="color: #0000ff;"&gt;if</span> (!<span style="color: #000000;"&gt;dic.ContainsKey(item.OrderID))
            {
                dic.Add(item.OrderID,item);
            }
            </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;
            {
                dic[item.OrderID] </span>=<span style="color: #000000;"&gt; item;
            }
        }</span></pre>

方案二:使用ToDictionary  

  

?  ??

?????? 从图中我们可以看到,发生悲剧的异常了,我们知道dictionary中key是不能重复的,然而ToDictionary中并没有给我们做

key的重复值判断,那也就侧面说明ToDictionary在kv中只能是 “一对一”的关系,也就是v中永远只会有一条记录,显然这不是

我需要的,在了解ToDictionary原理后,该方案失败。

方案三: 使用ToLookup

  

  也许微软知道客户有这么个需求,就采用了一个ToDictionary的加强版,你也可以认为是一种新的字典数据结构,它就避免了这

种“一对一”的关系,采用“一对多”的实现。

dic = ticketlist.ToLookup(i => </span><span style="color: #0000ff;"&gt;foreach</span> (<span style="color: #0000ff;"&gt;var</span> item <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; dic) { Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;订单号:</span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; item.Key); </span><span style="color: #0000ff;"&gt;foreach</span> (<span style="color: #0000ff;"&gt;var</span> item1 <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; item) { Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;tt</span><span style="color: #800000;"&gt;"</span> + item1.TicketNo + <span style="color: #800000;"&gt;"</span> <span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; item1.Description); } }</span></pre>

?而且ToLookup和字典一样,是带有索引形式,这个groupby就不具备了,当然Tolookup还有一个强大的功能,就是使用

Func elementSelector来对现在的v元素进行转换来避免我刚才? Console.WriteLine("tt" + item1.

TicketNo + "? " + item1.Description);语句

————————————————————————————————————————————————————————————

————————————————————————————————————————————————————————————

友情提示:如果不喜欢看文章,可以移步本系列的 ?【一把伞的钱哦

————————————————————————————————————————————————————————————

————————————————————————————————————————————————————————————

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读