C# C语言中的模式识别

C# C语言中的模式识别,c#,.net,design-patterns,c#-4.0,C#,.net,Design Patterns,C# 4.0,我有两节课 public class ClassA { public int ID { get; set; } public string Countries {get;set;} public string City { get;set; } } 及 这两个班在另一个班 public class ComponentClass { public List<ClassA> classAObj { get; set; } public List<ClassB&g

我有两节课

public class ClassA
{
 public int ID { get; set; }
 public string Countries {get;set;}
 public string City { get;set; }
}

这两个班在另一个班

public class ComponentClass
{
   public List<ClassA> classAObj { get; set; }
   public List<ClassB> classBObj { get; set; }
}
我想让它成为一个通用的工厂方法,它将为我执行循环并构建对象,以避免代码重复

public void CommonMethod(Base)
{
  // How do I differentiate the properties for looping 
}

如果目标是减少代码重复,那么可以将这两条语句重构为一个操作,如下所示

foreach(var data in c)
{
    Parent p = new Parent();

    Action<string> iAction = iString =>
    {
        Star s = new Star();
        s.Area = "infinite";
        s.Color = "red";
        List<string> sep = iString.Split(',').Select(string.Parse).ToList();

        foreach(var b in sep)
        {
            TinyStar t = new TinyStar();
            t.smallD = b;
            s.Values.Add(t);
        }
        p.Curves.Add(s);
    }

    if(data.classAObj.count > 0)
    {
        iAction(data.City);
    }

    if(data.classBObj.count > 0)
    {
        iAction(data.Village);
    }
}

json中这两种类型的数据类型属性相同,无法创建一个类来映射它

    public class ClassA
    {
     public int ID { get; set; }
     public string Countries {get;set;}
     public string Areas{ get;set; }
    }


public class ComponentClass
{
   public List<ClassA> classAObj { get; set; }
   public List<ClassA> classBObj { get; set; }
}


Main()
{
  ComponentClass[] c = //Data from 3rd party;
  foreach(var data in c)
  {
    Parent p = new Parent(); 
    GetParent   (p ,data.classAObj )
    GetParent   (p ,data.classBObj )
   }
}

void GetParent (Parent p, ClassA classObj){
 if(data.classAObj.count > 0)
    {
      Star s = new Star();
      s.Area = "infinite";
      s.Color = "red";
      List<string> sep = data.Areas.Split(',').Select(string.Parse).ToList();    
      foreach(var b in sep)
      {
       TinyStar t = new TinyStar();
       t.smallD = b;
       s.Values.Add(t);
       }
      p.Curves.Add(s);
     }
return p ;
}

我建议像您一样从一个公共基础继承ClassA和ClassB,然后在类型检查之后将它们转换为cast。如果您的唯一目标是最大限度地减少代码重复,这将使您达到以下目标:

class Program
{
    static void Main(string[] args)
    {
        ComponentClass[] c = new List<ComponentClass>().ToArray();//Data from 3rd party;

        foreach (var data in c)
        {
            Parent p = new Parent();


            if (data.classObjs.Count > 0)
            {
                Star s = new Star
                {
                    Area = "infinite",
                    Color = "red"
                };
                foreach (var b in data.classObjs)
                {
                    string bStr = b.GetType() == typeof(ClassA) ? ((ClassA)b).City : ((ClassB)b).Village;

                    bStr = bStr.Split(',').Select(string.Parse).ToList();

                    TinyStar t = new TinyStar
                    {
                        smallD = bStr
                    };
                    s.Values.Add(t);
                }
                p.Curves.Add(s);
            }
        }
    }
    public class ComponentClass
    {
        public List<ClassObj> classObjs { get; set; }
    }

    public class ClassObj
    {
        public int ID { get; set; }
        public string Countries { get; set; }
    }

    public class ClassA : ClassObj
    {
        public string City { get; set; }
    }

    public class ClassB : ClassObj
    {
        public string Village { get; set; }
    }
}
根据是否添加更多ClassObj类型的类,可能需要将十进制重构为if…else或切换


不过,请注意,GetType实际上是在运行时查询程序集的,从性能角度来看,应该谨慎使用,因为它在经常执行时会大大降低应用程序的速度。

我使用了反射,请检查它是否适用于您

public static void CommonMethod(dynamic collection)
{

        Parent p = new Parent();
        Star s = new Star();
        s.Area = "infinite";
        s.Color = "red";
        foreach (var data in collection)
        {
            var properties = data.GetType().GetProperties();

            foreach (var p in properties)
            {
                string propertytName = p.Name;

                var propertyValue = p.GetValue(data, null);

                if (propertytName == "City" || propertytName == "Village")
                {
                    List<string> sep = propertyValue.Split(',').ToList();
                    foreach (var b in sep)
                    {
                        TinyStar t = new TinyStar();
                        t.smallD = b;
                        s.Values.Add(t);
                    }
                    p.Curves.Add(s);
                }
            } 
        }
    }

    static void Main(string[] args)
    {
        ComponentClass[] c Data from 3rd party;
        foreach (var data in c)
        {
            CommonMethod(data.classAObj);
            CommonMethod(data.classBObj);
        }
}

您从第三方获取数据的格式是什么?是json吗?是的,它在json中。是否可以选择使用反射?是的,任何简化不必要的循环的东西都可以共享json的示例部分?
    public class ClassA
    {
     public int ID { get; set; }
     public string Countries {get;set;}
     public string Areas{ get;set; }
    }


public class ComponentClass
{
   public List<ClassA> classAObj { get; set; }
   public List<ClassA> classBObj { get; set; }
}


Main()
{
  ComponentClass[] c = //Data from 3rd party;
  foreach(var data in c)
  {
    Parent p = new Parent(); 
    GetParent   (p ,data.classAObj )
    GetParent   (p ,data.classBObj )
   }
}

void GetParent (Parent p, ClassA classObj){
 if(data.classAObj.count > 0)
    {
      Star s = new Star();
      s.Area = "infinite";
      s.Color = "red";
      List<string> sep = data.Areas.Split(',').Select(string.Parse).ToList();    
      foreach(var b in sep)
      {
       TinyStar t = new TinyStar();
       t.smallD = b;
       s.Values.Add(t);
       }
      p.Curves.Add(s);
     }
return p ;
}
class Program
{
    static void Main(string[] args)
    {
        ComponentClass[] c = new List<ComponentClass>().ToArray();//Data from 3rd party;

        foreach (var data in c)
        {
            Parent p = new Parent();


            if (data.classObjs.Count > 0)
            {
                Star s = new Star
                {
                    Area = "infinite",
                    Color = "red"
                };
                foreach (var b in data.classObjs)
                {
                    string bStr = b.GetType() == typeof(ClassA) ? ((ClassA)b).City : ((ClassB)b).Village;

                    bStr = bStr.Split(',').Select(string.Parse).ToList();

                    TinyStar t = new TinyStar
                    {
                        smallD = bStr
                    };
                    s.Values.Add(t);
                }
                p.Curves.Add(s);
            }
        }
    }
    public class ComponentClass
    {
        public List<ClassObj> classObjs { get; set; }
    }

    public class ClassObj
    {
        public int ID { get; set; }
        public string Countries { get; set; }
    }

    public class ClassA : ClassObj
    {
        public string City { get; set; }
    }

    public class ClassB : ClassObj
    {
        public string Village { get; set; }
    }
}
public static void CommonMethod(dynamic collection)
{

        Parent p = new Parent();
        Star s = new Star();
        s.Area = "infinite";
        s.Color = "red";
        foreach (var data in collection)
        {
            var properties = data.GetType().GetProperties();

            foreach (var p in properties)
            {
                string propertytName = p.Name;

                var propertyValue = p.GetValue(data, null);

                if (propertytName == "City" || propertytName == "Village")
                {
                    List<string> sep = propertyValue.Split(',').ToList();
                    foreach (var b in sep)
                    {
                        TinyStar t = new TinyStar();
                        t.smallD = b;
                        s.Values.Add(t);
                    }
                    p.Curves.Add(s);
                }
            } 
        }
    }

    static void Main(string[] args)
    {
        ComponentClass[] c Data from 3rd party;
        foreach (var data in c)
        {
            CommonMethod(data.classAObj);
            CommonMethod(data.classBObj);
        }
}