大写带有LINQ的对象列表

时间:2012-07-30 13:47:09

标签: c# 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 }
    };
}

更新

我不想循环或逐字段去。有没有办法通过反射来大写每个属性的值?

5 个答案:

答案 0 :(得分:14)

您为什么要使用LINQ?

使用List<T>.ForEach

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();
    }
}

答案 1 :(得分: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循环。

<强>更新

为什么需要这样的解决方案?只有一种方式可以通用的方式 - 反思。

答案 2 :(得分: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();

答案 3 :(得分:1)

最简单的方法是使用ConvertAll

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

ForEach不同的是,原始列表不会太多,而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
         });

答案 4 :(得分:0)

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