0

linqを使用してよりクリーンな方法でそれを書くことは可能ですか?

//retrieved from db
List<User> existingList = new List<User>()
{
new User() {
Id = 1,
Name = "test1",
City = "City1"
},
new User() {
Id = 2,
Name = "test2",
City = "City"
}
};

//modified by ui
List<User> modifiedlist = new List<User>()
{
new User() {
Id = 1,
Name = "test1",
City = "City1"
},
new User() {
Id = 3,
Name = "test3",
City = "City3"
}
};

** in db :(変更されたリストによる)ユーザー3を追加してユーザー2を削除する必要があり、1については気にしないでください。

** user2を削除する場合は、既存のリストをループし、変更されたリストに存在しない場合は2を削除します。** user3を追加する場合は、変更されたリストをループし、既存のリストに存在しない場合は3を追加します。

4

2 に答える 2

1

これはまさにあなたが必要とするもののように見えます。
方法: 2 つのリストの集合の違いを見つける (LINQ):

        List<int> existingList = new List<int>() { 1, 2 };
        List<int> modifiedList = new List<int>() { 1, 3 };

        var usersToDelete = existingList.Except(modifiedList).ToList(); //contains '2'
        var usersToAdd = modifiedList.Except(existingList).ToList(); //contains '3'
于 2012-08-31T02:30:16.307 に答える
-1

1,2,3 であることがわかっていて、1,4 が必要であることがわかっている場合は、RemoveAt(2) で 3 を削除し、[1] を 4 に設定して 2 を 4 に変更できます。RemoveAt はインデックスで処理されるため、Remove よりも高速です。

var list = new List<int> {1,2,3};

list.RemoveAt(2);
list[1] = 4;

もちろん、削除したい番号が存在するかどうか、また存在する場所がわからない場合は、明らかにそれらを検索する必要があります...

ここで、リストがソートされており、巨大であることを知っているとしましょう。toRemoveリストに 10,000 個の要素 {0,2,5,6,8,...} のランダムに並べ替えられた数値があり、{3,5 で並べ替えられている list にあるすべての数値を削除したい場合を考えてみましょう。,6,7,...}

toRemove.Count次に、次のように、時間を除いて実際にリストを 1 回繰り返すことができます。

int j = 0;

for (int i = 0; i < list.Count && j < toRemove.Count; i++)
{
    if (list[i] == toRemove[j])
    {
        list.RemoveAt(i);
        j++;
        i--;
    }
}

また、リストに重複する数字 {1, 4, 4, 5, 7,...} が含まれる可能性があり、4 が 1 つも存在しないように 4 を削除する場合は、次のようにする必要があります。

int j = 0;

for (int i = 0; i < list.Count && j < toRemove.Count; i++)
{
    var currRemove = toRemove[j];

    while (list[i] == currRemove)
    {
        list.RemoveAt(i);
        i--;
    }

    j++;
}

編集:

よりクリーンで効率を下げたい場合は、次のことができます。

list = list.Except(toRemove).Union(toAdd).ToList();

既に存在するアイテムを追加したくない場合:

var tmp = list.Except(toRemove);
list = list.Union(toAdd.Except(tmp)).ToList();

しかし、これは非常に遅く、リストを使用すること、おそらく HashTable またはDictionaryを使用することを再検討することをお勧めします。

于 2012-08-31T02:02:50.847 に答える