如何从我拆分的单个字符串创建一个对象?

Posted

技术标签:

【中文标题】如何从我拆分的单个字符串创建一个对象?【英文标题】:How can i create an object from this single string i've split? 【发布时间】:2022-01-09 06:56:52 【问题描述】:

我试图通过连接到技术服务数据库和过滤供应审计来报告所使用的供应,内部审计我关心的是 ActionNotes,它是一个格式如下的单个长字符串:

New Supplie Mobile added: /n Id: 1/n Name: Bateria /n Stock. 0/n Minimum Stock: 10/n IdSquad: 1/n IdSupplie: 1/n

我已经设法编写了这段代码,它在拆分和过滤我不需要的值后创建了一个字符串数组,结果如下:

private void ImportarServicioTecnico()
    
        var auditList = db3.Audit.ToList();

        var suppliesList = (from t in auditList where t.ActionNotes.ToLower().Contains("new supplie mobile added") select t).ToList();

        foreach (var i in suppliesList)
        
            InsumosST o = new InsumosST();
            
            var note = i.ActionNotes;
            Debug.WriteLine("Audit ID: " + i.Id.ToString() + " Date: " + i.AuditDate);

            string[] lines = Regex.Split(note, "/n");
            foreach (var l in lines)
            
                var checkstring = l.ToLower();
                string actual = l;

                if (checkstring.Contains("new supplie mobile added") || checkstring.Contains("description:")) continue;

                if (checkstring.Contains("stock."))
                
                    int pos2 = actual.IndexOf(".");
                    Debug.WriteLine(actual.Substring(pos2 + 1));
                    continue;
                

                int pos = actual.IndexOf(":");
                Debug.WriteLine(actual.Substring(pos + 1));
       
            
        
    

审核 ID:21 日期:15-11-2021 10:43:59 1 细菌 0 1 0 1 1

问题是:是否可以使用此代码从我的数据库模型创建对象? 这是我的模型:

public partial class InsumosST

    public int id  get; set; 
    public string supply  get; set; 
    public Nullable<System.DateTime> entrydate  get; set; 
    public string squad  get; set; 

enter code here

【问题讨论】:

是什么阻止您实例化InsumosST 的新实例,然后分配您在foreach 循环中解析的值? 事实上,我为“行”的每个循环只得到一个值,所以如果我创建一个新实例,我只会为对象分配一个值 【参考方案1】:

当然.. 让我们有一些代表字典,将值分配给 InsumosST 的属性,在 /n 上拆分行,然后在 : 上再次拆分以获取 id 和值,在字典中查找 id,如果它在那里,调用传递值的委托

private void ImportarServicioTecnico()

    var auditList = db3.Audit.ToList();

    var suppliesList = (from t in auditList where t.ActionNotes.ToLower().Contains("new supplie mobile added") select t).ToList();


    //make a dictionary of the string we look for and the "method" to execute if we find that string
    //the methods are one-liners that set the appropriate value on the object
    var d = new Dictionary<string, Action<string, InsumosST>();
    d["id"] = (v, i) => i.id = int.TryParse(v, out int z) ? z : SOME_DEFAULT_ID_HERE; 
    d["idsupplie"] = (v, i) => i.supply = v;
    d["idsquad"] = (v, i) => i.squad = v;


    foreach (var i in suppliesList)
    
        var o = new InsumosST();

        var bits = i.ActionNotes.Split("/n");
        foreach (var line in lines)
        
            var bits = line.Split(new[]':','.', 2);  //line is e.g. "idsupplie: 1"
            if(bits.Length < 2) continue;        //if we don't have an id and value

            var id = bits[0].ToLower();          //e.g. "idsupplie"
            var val = bits[1].Trim();            //e.g. "1"

            if(d.TryGetValue(id, out var m))     //if we know this id, e.g. "id", "idsupplie", "idsquad"
              m(val, o);                         //call the delegate; it will assign val to the right property of o
   
        

        context.InsumosSts.Add(o);
    
    context.SaveChanges();

我想最难“理解”这一点的是,如果你真的不习惯委托;您已经使用过它们(从概念上讲,where t.ActionNotes.ToLower().Contains("new supplie mobile added") 是这样的 => 这是一种从 from 确定的某个输入值生成 bool 的方法),但这并不意味着您会熟悉它们。

简单地说,委托是一种将方法代码存储在变量中的方式,就像我们存储数据一样。你可以给一个变量赋值一个方法,然后执行这个变量来运行代码:

var someMethod = () => Debug.WriteLine("hello");
someMethod(); //prints hello

你可以让他们接受参数:

var someMethod = (string s) => Debug.WriteLine(s);
someMethod("hello"); //prints hello

所以我们在这里所做的只是组成了一堆方法,将 props 分配给传入的 InsumosSt

var x = (InsumosST i, string v) => i.idsupplie = v;
x(someInsumosObject, "hello"); //assigns "hello" to someInsumosObject.idsupplie property

这意味着支持更多的属性,你只需将它们添加到 InsumosST 和 编写一个分配它们的字典条目:

public partial class InsumosST

    public int id  get; set; 
    public string supply  get; set; 
    public Nullable<System.DateTime> entrydate  get; set; 
    public string squad  get; set; 

    //new!
    public string Name get;set;

d["name"] = (v, i) => i.Name = v;

【讨论】:

以上是关于如何从我拆分的单个字符串创建一个对象?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在单个语句中拆分和分配字符串?

如何通过拆分其中的字符串将单个列拆分为多个。 -Pandas Python [重复]

如何在字符串中拆分和添加单个值?

如何将返回文本拆分为 extjs 中的单个字符串?

如何在 BigQuery SQL 中将字符串列拆分为多行单个单词和单词对?

使用单个字符或仅一个字符串来提升拆分