c# L oop Список <T>значения строки и столбца обрезки - PullRequest
0 голосов
/ 21 января 2020
public class Person {
   string Name 
   string Address 
   int Age 
   .. 100+ more columns 
}

var result = new List<Person>();

foreach (var item in result )
{
        //loop column and trim the values.     

}

Я хочу, чтобы самым простым способом было l oop столбцов (при условии 100+ столбцов), где тип данных - строка, а затем обрезать значение.

Перефразируя в более C# терминах: я хочу обновить все свойства и поля объекта типа string с усеченным значением как item.StringProp = item.StringProp.Trim(). Я не хочу писать обновление вручную для каждого свойства.

Ответы [ 4 ]

4 голосов
/ 21 января 2020

Вы можете использовать отражение и Linq для фильтрации свойств типа string. С точки зрения ОП, похоже, что вы используете поля вместо свойств. Обратите внимание, что неясно, являются ли Свойства / Поля общедоступными c из OP, если вам нужно использовать публичные c поля / свойства, используйте BindingFlags.Publi c

public List<T> TrimList<T>(List<T> source)
{
    foreach(var property in  typeof(T).GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Where(x=>x.FieldType== typeof(string)))
    {
        foreach(var personItem in source)
            property.SetValue(personItem,Convert.ToString(property.GetValue(personItem)).Trim());
    }
    return source;
}

Если свойства , вы можете использовать

public List<T> TrimList<T>(List<T> source)
{
    foreach(var property in  typeof(T).GetProperties(BindingFlags.NonPublic | BindingFlags.Instance).Where(x=>x.PropertyType== typeof(string)))
    {
        foreach(var personItem in source)
            property.SetValue(personItem,Convert.ToString(property.GetValue(personItem)).Trim());
    }
    return source;
}

Демонстрационный код

Примечание: до. NET 4.5 вам нужно передать ноль в качестве второго аргумента:

public List<T> TrimList<T>(List<T> source)
{
    foreach(var property in  typeof(T).GetProperties(BindingFlags.NonPublic | BindingFlags.Instance).Where(x=>x.PropertyType== typeof(string)))
    {
        foreach(var personItem in source)
            property.SetValue(personItem,Convert.ToString(property.GetValue(personItem,null)).Trim());
    }
    return source;
}
0 голосов
/ 22 января 2020

Вы можете использовать Этот пакет Nuget . После установки используйте его как показано ниже:

result.ForEach(x => x.AdjustString());
0 голосов
/ 21 января 2020

Вот как я бы это реализовал:

class Program
{
    static void Main(string[] args)
    {
        var obj = new Person
        {
            MyProperty = " A",
            MyProperty1 = " A ",
            MyProperty2 = "A ",
            MyProperty3 = "A A A",
        };
        TrimStrings(obj);
    }

    public static void TrimStrings(object obj)
    {
        Type stringType = typeof(string);
        var properties = obj.GetType().GetProperties().Where(x => x.PropertyType == stringType);
        foreach(var property in properties)
        {
            string value = (string)property.GetValue(obj);
            property.SetValue(obj, value?.Trim());
        }
    }
}

public class Person
{
    public string MyProperty { get; set; }
    public string MyProperty1 { get; set; }
    public string MyProperty2 { get; set; }
    public string MyProperty3 { get; set; }
}

Вывод:

{"MyProperty": "A", "MyProperty1": "A", "MyProperty2 ":" A "," MyProperty3 ":" A AA "}

0 голосов
/ 21 января 2020

Помимо рефлексии, другой способ - возложить на него ответственность класса Person.

public class Person {
   public string Name { get; set; }
   public string Address { get; set; }
   public int Age { get; set; } 
   .. 100+ more columns 

  public void DoTrim()
  {
      this.Name = this.Name.Trim();
      this.Address = this.Address.Trim();
      ... still need to code 100+ properties
  }
}

Преимущество состоит в том, что вы можете называть его следующим образом:

var result = new List<Person>();
...
for(int i=0; i < result.Count(); i++)
{           
    result[i].DoTrim();
}

Или вы можете управлять своими данными в классе Person, когда устанавливаете их и используете локальные частные переменные.

public class Person {
   private string name;
   public string Name
   {
       get { return name; }
       set { name = value.Trim(); }
   }

   private string address;
   public string Address
   {
       get { return address; }
       set { address= value.Trim(); }
   }
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...