2012-07-30 57 views
1

我有下面的代碼。我想將此列表中的所有項目都轉換爲大寫。大寫與LINQ對象列表

有沒有辦法在Linq做到這一點?

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
} 

public class MyClass 
{ 
    List<Person> myList = new List<Person>{ 
     new Person { FirstName = "Aaa", LastName = "BBB", Age = 2 }, 
     new Person{ FirstName = "Deé", LastName = "ève", Age = 3 } 
    }; 
} 

更新

我不想循環或場轉場。有沒有反映大寫每個屬性的值的方法?

+0

您可以使用List.ForEach,但這只是foreach循環的替代。 Linq不是要對數據對象進行更改,而是進行查詢。 – 2012-07-30 13:50:06

+0

爲什麼不在創建對象時規範化名稱? – user7116 2012-07-30 13:52:29

+0

@ Kris-I:爲什麼你需要這樣的通用方法,你是否有大量的對象,你不會爲每個特殊的循環/方法寫大寫字母屬性? – sll 2012-07-30 14:02:31

回答

12

你爲什麼要使用LINQ?

使用:

myList.ForEach(z => 
       { 
        z.FirstName = z.FirstName.ToUpper(); 
        z.LastName = z.LastName.ToUpper(); 
       }); 

編輯:不知道爲什麼要通過反射來做到這一點(我不會做這種個人...),但這裏的一些代碼,將大寫所有返回字符串的屬性。請注意,這是遠遠不夠完善,但它是爲你如果你真的想用反思的基礎...:

public class Person 
{ 
    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public int Age { get; set; } 
} 

public static class MyHelper 
{ 
    public static void UppercaseClassFields<T>(T theInstance) 
    { 
     if (theInstance == null) 
     { 
      throw new ArgumentNullException(); 
     } 

     foreach (var property in theInstance.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) 
     { 
      var theValue = property.GetValue(theInstance, null); 
      if (theValue is string) 
      { 
       property.SetValue(theInstance, ((string)theValue).ToUpper(), null); 
      } 
     } 
    } 

    public static void UppercaseClassFields<T>(IEnumerable<T> theInstance) 
    { 
     if (theInstance == null) 
     { 
      throw new ArgumentNullException(); 
     } 

     foreach (var theItem in theInstance) 
     { 
      UppercaseClassFields(theItem); 
     } 
    } 
} 

public class Program 
{ 
    private static void Main(string[] args) 
    { 
     List<Person> myList = new List<Person>{ 
      new Person { FirstName = "Aaa", LastName = "BBB", Age = 2 }, 
      new Person{ FirstName = "Deé", LastName = "ève", Age = 3 } 
     }; 

     MyHelper.UppercaseClassFields<Person>(myList); 

     Console.ReadLine(); 
    } 
} 
+0

謝謝,但沒有屬性,或循環。查看我的更新1 – 2012-07-30 13:56:09

+0

@ Kris-I查看更新後的答案 – ken2k 2012-07-30 14:06:18

+0

如果任何屬性字符串爲空,ken2k不會拋出異常... – 2012-07-30 14:14:53

2

LINQ不提供任何工具來更新底層數據。使用LINQ,您可以從現有的創建一個新的列表:

// I would say this is overkill since creates a new object instances and 
// does ToList() 
var updatedItems = myList.Select(p => new Person 
           { 
           FirstName = p.FirstName.ToUpper(), 
           LastName = p.LastName.ToUpper(), 
           Age = p.Age 
           }) 
         .ToList(); 

如果使用LINQ是不是校長,我會建議使用foreach循環。

UPDATE:

爲什麼需要這樣的解決方案?只有一種以通用的方式來做到這一點 - 反思。

+0

列表 .ForEach? – davenewza 2012-07-30 13:52:41

+1

@davenewza這不是一個LINQ方法。 – 2012-07-30 13:53:26

+0

對,這是一個案例(不是LINQ的) – sll 2012-07-30 13:53:46

1

你真的只能使用LINQ提供新的對象列表

var upperList = myList.Select(p=> new Person { 
    FirstName = (p.FirstName == null) ? null : p.FirstName.ToUpper(), 
    LastName = (p.LastName == null) ? null : p.LastName.ToUpper(), 
    Age = p.Age 
    }).ToList(); 
+0

這個問題的由來,但是沒有屬性或者屬性循環。看到我的更新1 – 2012-07-30 13:57:21

0
p.lastname.ToString().ToUpper().Contains(TextString) 
1

最簡單的辦法是使用ConvertAll

myList = myList.ConvertAll(d => d.ToUpper()); 

沒有太多超過太大的不同會循環顯示原始列表,而ConvertAll會創建一個需要重新指定的新列表。

var people = new List<Person> { 
    new Person { FirstName = "Aaa", LastName = "BBB", Age = 2 }, 
    new Person{ FirstName = "Deé", LastName = "ève", Age = 3 } 
}; 
people = people.ConvertAll(m => new Person 
     { 
      FirstName = m.FirstName?.ToUpper(), 
      LastName = m.LastName?.ToUpper(), 
      Age = m.Age 
     });