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 に答える