为了账号安全,请及时绑定邮箱和手机立即绑定

c# - 如何使用内置库将字符串的DataTable映射到C#中的整数DataTable?

c# - 如何使用内置库将字符串的DataTable映射到C#中的整数DataTable?

PHP
SMILET 2022-01-09 10:00:19
我有一组 DataTables,每个都有一组行和一组列,所有字符串。我正在寻找最好的方法(即最短的代码长度和可选的最有效的性能)将这些数据表中的每一个映射到具有整数值的数据表,这样相同的字符串将始终由相同的整数值表示跨所有表,也在同一个表中(不编写我自己的循环/等,因为一种选择是循环所有数据并从字符串中创建整数)。我的问题是:c# 中是否有任何内置库可以通过调用方法来执行此任务?假设: a) 有数千个表,表中有数百万个条目。b) 解决方案可能区分大小写或不区分大小写。假设这样的例子:DataTableInStrings1.Rows[10]["Column10"] = "val1";DataTableInStrings2.Rows[2]["Column1"] = "val1";预期的短代码:DataTable dataTableInIntegers1 = LibIAmAfter.MethodIAmAfter(DataTableInStrings1)DataTable dataTableInIntegers2 = LibIAmAfter.MethodIAmAfter(DataTableInStrings2)预期结果dataTableInIntegers1.Rows[10]["Column10"]=12; dataTableInIntegers2.Rows[2]["Column1"]=12;而整数 12 可以是任何值。这里是随机选择来说明目标的。==> 另一个帮助理解问题的例子:row1InStrings: ("abc","def","abc","zxv","was","morning","def","dr","tr","uy");row2InStrings: ("abc2","def2","abc3","zxv4","was4","morning2","def2","dr3","tr3","uy");映射后的示例结果:row1InIntegers: 1,2,1,3,4,5,2,6,7,8row2InIntegers: 10,11,12,14,15,16,11,17,18,8
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

一种方法是使用 aDictionary<string, int>将单元格数据存储为键,将映射整数存储为值。


请注意,您不必一次用整个数据集填充映射。只要您维护一个映射字典,您就可以在访问项目时简单地填充它。


请注意,这只会保证字符串的值是唯一的,但在后续运行中不一定是相同的值(因为这些值基于请求 id 的时间而不是字符串本身)。


像这个带有私有字段和访问方法的静态类应该可以工作(尽管不是线程安全的):


public static class Mapper

{

    private static readonly Dictionary<string, int> Mapping = 

        new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);


    public static int GetId(string value)

    {

        int result;


        if (!Mapping.TryGetValue(value, out result))

        {

            result = Mapping.Count + 1;

            Mapping.Add(value, result);

        }


        return result;

    }

}

使用此方法,我们可以根据需要获取映射,并且仅在必要时填充字典:


DataTable tbl1 = new DataTable("table1");

tbl1.Columns.Add(new DataColumn("col1"));

tbl1.Columns.Add(new DataColumn("col2"));

tbl1.Columns.Add(new DataColumn("col3"));

tbl1.Columns.Add(new DataColumn("col4"));

tbl1.Columns.Add(new DataColumn("col5"));

tbl1.Columns.Add(new DataColumn("col6"));

tbl1.Columns.Add(new DataColumn("col7"));

tbl1.Columns.Add(new DataColumn("col8"));

tbl1.Columns.Add(new DataColumn("col9"));

tbl1.Columns.Add(new DataColumn("col10"));


tbl1.Rows.Add("abc", "def", "abc", "zxv", "was", "morning", "def", "dr", "tr", "uy");

tbl1.Rows.Add("abc2", "def2", "abc3", "zxv4", "was4", "Morning", "def2", "dr3", "tr3", "uy");


// Output mappings, which populates the dictionary     

// only when needed as each mapping is requested

foreach (DataRow row in tbl1.Rows)

{

    Console.WriteLine(string.Join(",", 

        row.ItemArray.Select(item => Mapper.GetId(item.ToString()))));

}

输出

//img1.sycdn.imooc.com//61da41d40001d21603770188.jpg

查看完整回答
反对 回复 2022-01-09
?
LEATH

TA贡献1936条经验 获得超7个赞

您可以使用确定性 guid 来创建唯一的哈希。此外,您可以将值本身用作它自己的唯一哈希。如果由于某种原因,您无法向用户显示原始值但仍想在列表中找到它,我只能看到这很有用。例如,一组密码。


    [TestMethod]

    public void test_sum_stringchars()

    {

        string tmp = "foobar5";

        Console.WriteLine("Value = " + tmp.ToCharArray().Sum(x => x));

        // 686

        Console.WriteLine("Value = " + ToGuidKey(tmp));

        // 79ceeb8d


        tmp = "foobar6";

        Console.WriteLine("Value = " + tmp.ToCharArray().Sum(x => x));

        // 687

        Console.WriteLine("Value = " + ToGuidKey(tmp));

        // f1f08c51


        tmp = "goobar5";

        Console.WriteLine("Value = " + tmp.ToCharArray().Sum(x => x));

        // 687

        Console.WriteLine("Value = " + ToGuidKey(tmp));

        // f7da9f42


        tmp = "foocar5";

        Console.WriteLine("Value = " + tmp.ToCharArray().Sum(x => x));

        // 687

        Console.WriteLine("Value = " + ToGuidKey(tmp));

        // 7698c7ec

    }

    public static Guid ToGuid(string src)

    {

        byte[] stringbytes = System.Text.Encoding.UTF8.GetBytes(src);

        byte[] hashedBytes = new System.Security.Cryptography

            .SHA1CryptoServiceProvider()

            .ComputeHash(stringbytes);

        Array.Resize(ref hashedBytes, 16);

        return new Guid(hashedBytes);

    }

    public static string ToGuidKey(string src)

    {

        return ToGuid(src).ToString().Split('-').First();

    }


查看完整回答
反对 回复 2022-01-09
  • 2 回答
  • 0 关注
  • 233 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号