クラス オブジェクトのリストがありますUserData
。where
メソッドを介してこのリストからオブジェクトを取得します
UserData.Where(s => s.ID == IDKey).ToList(); //ID is unique
オブジェクトにいくつかの変更を加えて、リスト内の同じ場所に挿入したいと考えています。ただし、このオブジェクトのインデックスはありません。
それを行う方法はありますか?
ありがとう
UserData.FindIndex(s => s.ID == IDKey)
メソッドIt will return an intを使用してインデックスを取得できます
。
LIST からアイテムを取得するときに参照型である場合、それに何かを更新すると、LIST の値が自動的に変更されます。更新後はご自身でご確認ください........
入手したアイテム
UserData.Where(s => s.ID == IDKey).ToList();
参照型です。
UserData
が参照型である限り、リストはそのオブジェクトのインスタンスへの参照のみを保持します。そのため、削除/挿入を必要とせずにそのプロパティを変更できます (明らかに、そのオブジェクトのインデックスは必要ありません)。
また、ID が一意である限り、Single
メソッド (の代わりに)を使用することをお勧めします。ToList()
例
public void ChangeUserName(List<UserData> users, int userId, string newName)
{
var user = users.Single(x=> x.UserId == userId);
user.Name = newName; // here you are changing the Name value of UserData objects, which is still part of the list
}
を使用してオブジェクトをフェッチし、SingleOrDefault
関連する変更を加えるだけです。リストに再度追加する必要はありません。リストの要素である同じインスタンスを変更するだけです。
var temp = UserData.SingleOrDefault(s => s.ID == IDKey);
// apply changes
temp.X = someValue;
私があなたを誤解しているなら、私を訂正してください、しかしあなたはあなたが本質的にリストの要素を反復したいと言っていると思います、そしてそれが条件に一致するならあなたはそれを何らかの方法で変更してそれに追加したいと思います別のリスト。
その場合は、以下のコードを参照して、Where句を使用して匿名メソッドを作成する方法を確認してください。Where句には、以下に一致する無名関数またはデリゲートが必要です。
パラメータ:ElementType要素、intインデックス-戻り値:bool結果
これにより、ブール値の戻り値に基づいて要素を選択または無視できます。これにより、次のように、単純なブール式、または追加の手順を含むより複雑な関数を送信できます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace StackOverflow
{
class Program
{
static void Main(string[] args)
{
int IDKey = 1;
List<SomeClass> UserData = new List<SomeClass>()
{
new SomeClass(),
new SomeClass(1),
new SomeClass(2)
};
//This operation actually works by evaluating the condition provided and adding the
//object s if the bool returned is true, but we can do other things too
UserData.Where(s => s.ID == IDKey).ToList();
//We can actually write an entire method inside the Where clause, like so:
List<SomeClass> filteredList = UserData.Where((s) => //Create a parameter for the func<SomeClass,bool> by using (varName)
{
bool theBooleanThatActuallyGetsReturnedInTheAboveVersion =
(s.ID == IDKey);
if (theBooleanThatActuallyGetsReturnedInTheAboveVersion) s.name = "Changed";
return theBooleanThatActuallyGetsReturnedInTheAboveVersion;
}
).ToList();
foreach (SomeClass item in filteredList)
{
Console.WriteLine(item.name);
}
}
}
class SomeClass
{
public int ID { get; set; }
public string name { get; set; }
public SomeClass(int id = 0, string name = "defaultName")
{
this.ID = id;
this.name = name;
}
}
}