美文网首页.NET
C#自定义泛型KeyValue实现双向查询

C#自定义泛型KeyValue实现双向查询

作者: 白龙马5217 | 来源:发表于2020-02-18 15:00 被阅读0次

大概查了一下C#的集合貌似没有能双向查询的键值对,项目开发中经常用到双向查询,比如通过数据库字段名查EM实体模型属性或字段名,通过EM实体模型属性字段名查询对应的数据库名。刚好学习一下自定义泛型,搞个KeyValue泛型类,实现双向查询。

1KeyValue类图设计

其实自定义泛型也很简单,KeyValue用2个1对1的List泛型集合即可实现。类的设计图如下:

KeyValue类图

2KeyValue代码

using System;
using System.Collections.Generic;
using System.Linq;

namespace KeyValue
{
    /// <summary>
    /// 定义泛型KeyValue,可以双向查询,200218 made by BLMa
    /// </summary>
    /// <typeparam name="TKey"></typeparam>
    /// <typeparam name="TValue"></typeparam>
    public class KeyValue<TKey, TValue>
    {
        /// <summary>
        /// Keys键表
        /// </summary>
        public List<TKey> tKey = new List<TKey>();
        /// <summary>
        /// Values值表
        /// </summary>
        public List<TValue> tValue = new List<TValue>();

        /// <summary>
        /// 集合数
        /// </summary>
        public int Count { get { return tKey.Count; } }

        /// <summary>
        /// Add 方法,增加一对键值
        /// </summary>
        /// <param name="tkey"></param>
        /// <param name="tvalue"></param>
        public void Add(TKey tkey,TValue tvalue)
        { 
            if (tKey.Contains<TKey>(tkey) || tValue.Contains<TValue>(tvalue) )
                throw new ArgumentException("tKey 或 tValue重复");
            tKey.Add(tkey);
            tValue.Add(tvalue);
        }

        /// <summary>
        /// 按Key键查询Value值
        /// </summary>
        /// <param name="tkey"></param>
        /// <returns></returns>
        public TValue Key2Value(TKey tkey)
        {
            int ik = tKey.BinarySearch(tkey);
            if (ik < 0)
                throw new ArgumentException("tKey 没找到");
            return tValue[ik];
        }

        /// <summary>
        /// 按Value值查询Key键
        /// </summary>
        /// <param name="tvalue"></param>
        /// <returns></returns>
        public TKey Value2Key(TValue tvalue)
        {
            int iv = tValue.BinarySearch(tvalue);
            if ( iv < 0)
                throw new ArgumentException("tValue 没找到");
            return tKey[iv];
        }

        /// <summary>
        /// 清空
        /// </summary>
        public void Clear()
        {
            tKey.Clear();
            tValue.Clear();
        }

        /// <summary>
        /// 按Key键删除
        /// </summary>
        /// <param name="tkey"></param>
        /// <returns></returns>
        public bool RemoveByKey(TKey tkey)
        {
            int ik = tKey.BinarySearch(tkey);
            if (ik < 0) 
                throw new ArgumentException("tKey 没找到");

            tKey.Remove(tkey);
            tValue.RemoveAt(ik);
            return true;
        }

        /// <summary>
        /// 按Value值删除
        /// </summary>
        /// <param name="tkey"></param>
        /// <returns></returns>
        public bool RemoveByValue(TValue tvalue)
        {
            int iv = tValue.BinarySearch(tvalue);
            if (iv < 0)
                throw new ArgumentException("tValue 没找到");

            tValue.Remove(tvalue);
            tKey.RemoveAt(iv);
            return true;
        }
    }
}

3KeyValue应用示例

KeyValue应用示例

直接上示例代码,一看就明白

//声明KeyValue键值
KeyValue<string, string> kv = new KeyValue<string, string>();

//增加键值对
kv.Add("1", "A");
kv.Add("2", "B");
kv.Add("3", "C");
kv.Add("4", "D");
kv.Add("5", "E");

//键值对数
int ic = kv.Count;
Count = 5

//键查值
string value = kv.Key2Value("3");
value = C

//值查键
string key = kv.Value2Key("D");
key = 4

//通过Key键删除
bool br = kv.RemoveByKey("4");
br = True  Count = 4

//通过Value值删除
bool bv = kv.RemoveByValue("C");
bv = True  Count = 3

//清空
kv.Clear();
Count = 0

相关文章

  • C#自定义泛型KeyValue实现双向查询

    大概查了一下C#的集合貌似没有能双向查询的键值对,项目开发中经常用到双向查询,比如通过数据库字段名查EM实体模型属...

  • 008-自定义泛型,Collections

    自定义泛型 泛型类 代码实现 测试 泛型接口 代码实现 泛型方法 代码演示 测试 泛型上下边界 Collectio...

  • Kotlin泛型 (4)泛型接口

      自定义泛型接口和自定义泛型类声明方式完全一样。以下是对上一章节泛型类代码的修改,配合使用泛型接口实现队列功能。...

  • C#基础提升系列——C#泛型

    C# 泛型(Generics) 泛型概述 泛型是C#编程语言的一部分,它与程序集中的IL(Intermediate...

  • 探秘 Java 中的泛型(Generic)

    本文包括:JDK5之前集合对象使用问题泛型的出现泛型应用泛型典型应用自定义泛型——泛型方法自定义泛型——泛型类泛型...

  • Web笔记-基础加强

    泛型高级应用 自定义泛型方法 自定义泛型类 泛型通配符? 泛型的上下限 泛型的定义者和泛型的使用者 泛型的定义者:...

  • Java泛型

    参考:Java知识点总结(Java泛型) 自定义泛型类 自定义泛型接口 非泛型类中定义泛型方法 继承泛型类 通配符...

  • C#---API-02(Application Programm

    一、泛型概述 1. 泛型 1.1 泛型是什么? 泛型(generic)是C#语言2.0和通用语言运行时(CLR)得...

  • 泛型

    ORM实现有反射、泛型、代码生成等几种常见方式,或者单用,或者混合。 c#的泛型非常强大,应用于ORM时,可能有些...

  • 泛型

    ORM实现有反射、泛型、代码生成等几种常见方式,或者单用,或者混合。 c#的泛型非常强大,应用于ORM时,可能有些...

网友评论

    本文标题:C#自定义泛型KeyValue实现双向查询

    本文链接:https://www.haomeiwen.com/subject/vplgfhtx.html