лучший способ обновить объект в одном из множества списков - PullRequest
1 голос
/ 23 марта 2012

Я пытаюсь найти лучший способ обновить объект, который может быть в одном из нескольких различных списков / коллекций

Пример:

public class MyItem
{
    public Guid Id { get; set; }
    public string Name { get; private set; }
    public string Status { get; private set; }

    public MyItem(string name)
    {
        this.Id = new Guid();
        this.Name = name;
    }

    public void UpdateStatus(string status)
    {
        this.Status = status;
    }
}

public class OtherClass
{
    public ObservableCollection<MyItem> ItemList1;
    public ObservableCollection<MyItem> ItemList2;
    public ObservableCollection<MyItem> ItemList3;

    public UpdateStatus(Guid id, string status)
    {
        // Figure out which ItemList needs to be updated
        var item = ItemList1.FirstOrDefault(s => s.Id == id);
        if (item == null)
        {
            item = ItemList2.FirstOrDefault(s => s.Id == id);
            if (item == null)
            {
                item = ItemList3.FirstOrDefault(s => s.Id == id);
                if (item == null)
                {
                    Debug.WriteLine("Unable to update Status");
                    return;
                }
            }
        }
        item.UpdateStatus(status);
    }
}

Мне не нравитсяЯ уверен, что есть лучший способ, но его пятница и мой мозг зажарены: (

Я понимаю, что мог бы добавить что-то подобное вместо вложенного ifs:

public MyItem UpdatedStatus(ObservableCollection collection, Guid id)
{
    return collection.FirstOrDefault(s => s.Id == id);
}

или

public bool UpdatedStatus(ObservableCollection collection, Guid id, string status)
{
    var item = collection.FirstOrDefault(s => s.Id == id);
    if (item != null)
    {
        item.UpdateStatus(status);
        return true;
    }
    return false;
}

Но, похоже, должен быть лучший способ

Какие-нибудь советы?

В этих коллекциях могут быть сотни предметов с большимпоследние, поэтому я пытаюсь найти наиболее эффективный способ обработки обновлений.

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

LINQ за помощь. Это работает для вас, как ожидалось?

var item = ItemList1.Union(ItemList2)
                    .Union(ItemList3)
                    .FirstOrDefault(s => s.Id == id);

Важно:

Union () возвращает уникальные элементы, это может быть медленно для больших наборов данных, поэтому рассмотрите возможность использования Concat () для больших списков вместо "

var item = ItemList1.Concat(ItemList2)
                    .Concat(ItemList3)
                    .FirstOrDefault(s => s.Id == id);

Также стоит взглянуть на реализацию Concat() Джона Скита из edulinq serie, Concat() действительно проста: ( Полная статья )

private static IEnumerable<TSource> ConcatImpl<TSource>( 
    IEnumerable<TSource> first, 
    IEnumerable<TSource> second) 
{ 
    foreach (TSource item in first) 
    { 
        yield return item; 
    } 
    foreach (TSource item in second) 
    { 
        yield return item; 
    } 
}
3 голосов
/ 23 марта 2012

Вы можете использовать нуль-коалесцирующий оператор (??) для упрощения вашего кода:

public UpdateStatus(Guid id, string status) 
{ 
    var item = ItemList1.FirstOrDefault(s => s.Id == id)
        ?? ItemList2.FirstOrDefault(s => s.Id == id)
        ?? ItemList3.FirstOrDefault(s => s.Id == id)
    if (item == null) 
    { 
        Debug.WriteLine("Unable to update Status"); 
        return; 
    } 
    item.UpdateStatus(status); 
} 
...