5

我有下面的代码。我想将此列表中的所有项目转换为大写。

有没有办法在 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 }
    };
}

更新

我不想逐场循环或逐场进行。有没有办法通过反射将每个属性的值大写?

4

5 回答 5

19

为什么要使用 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();
    }
}
于 2012-07-30T13:51:19.537 回答
4

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循环。

更新:

为什么需要这样的解决方案?只有一种以通用方式执行此操作的方法 - 反射。

于 2012-07-30T13:49:27.250 回答
3

最简单的方法是使用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
         });

回答您的更新

我不想逐场循环或逐场进行。有没有办法通过反射将每个属性的值大写?

如果您不想逐场循环或逐场进行。你可以使用类上的属性来给你大写,就像这样

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public string FirstNameUpperCase => FirstName.ToUpper();
    public string LastNameUpperCase => LastName.ToUpper();
}

或者你可以像这样使用后场

public class Person
{
    private string _firstName;
    public string FirstName {
        get => _firstName.ToUpper();
        set => _firstName = value;
    }

    private string _lastName;
    public string LastName {
        get => _lastName.ToUpper();
        set => _lastName = value;
    }

    public int Age { get; set; }
}
于 2015-06-30T02:38:49.817 回答
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();
于 2012-07-30T13:52:41.247 回答
0
p.lastname.ToString().ToUpper().Contains(TextString)
于 2014-07-12T02:39:29.640 回答