Быстрый вопрос: одиночный оператор C # Linq и цикл for

Мне нужны пояснения. Эти два метода одинаковые или разные? Я немного запутался, когда обновляется ссылка на объект, переданный в параметре по значению, и когда создается новый. Я знаю, создает ли это назначение новую ссылку, но как насчет изменения свойства? Будут ли оба этих метода обновлять поле "_someObjectList" одинаково?

 public class SomeObject{
     public Guid UniqueKey { get; set; }
     public object SomeProperty{ get; set; }
 }

 public class SomeObjectListWrapper{

    public SomeObjectListWrapper(List<SomeObject> someObjectList){
        _someObjectList = someObjectList;
    }

    private readonly List<SomeObject> _someObjectList;

    public void ReplaceItemPropertyValue1(Guid itemUniqueKey, object propertyValue)
    {

        List<int> resultIndices = new List<int>();
        for (var i = 0; i < _someObjectList.Count(); i++)
        {
            if (_someObjectList[i].UniqueKey == itemUniqueKey)
                resultIndices.Add(i);
        }

        if (resultIndices.Count != 1)
            throw new Exception(
                "just pretend this is the same exception as Single() throws when it can't find anything");
        _someObjectList[resultIndices[0]].SomeProperty = propertyValue;
    }

    public void ReplaceItemPropertyValue2(Guid itemUniqueKey, object propertyValue)
    {
        _someObjectList.Single(x=>x.UniqueKey==itemUniqueKey).SomeProperty=propertyValue;
    }
}

person smartcaveman    schedule 03.10.2010    source источник


Ответы (3)


Поскольку SomeObject является классом (т. Е. Ссылочным типом), оба ReplaceItemPropertyValue метода обновляют один и тот же объект, который был вставлен в список, и будут извлечены из списка позже. (Если SomeObject был типом структура / значение, компилятор не позволил бы вам обновить rvalue / возвращаемое значение [1].)

В качестве небольшого примечания, ваши два метода на самом деле не идентичны. Метод Single вызывает исключение, если в последовательности есть более одного совпадающего элемента. Чтобы правильно согласовать поведение, используйте вместо этого First.


  1. «rvalue» на самом деле не является сокращением от «возвращаемое значение», просто в этом случае ваше rvalue является возвращаемым значением, поэтому я указал оба параметра.
person Zooba    schedule 03.10.2010
comment
Я отредактировал опубликованный код и думаю, что теперь он должен отражать Single () вместо First (). Пожалуйста, порекомендуйте. Спасибо за помощь. Если у вас есть время, не могли бы вы объяснить или дать ссылку на свой комментарий (если SomeObject был структурой). У меня есть класс Dictionary (я считаю, что он унаследован от ICollection ‹KeyValuePair‹, ››), когда я спрашиваю об этом. Еще раз спасибо. - person smartcaveman; 03.10.2010
comment
Ответ на stackoverflow.com/questions/2414906/ кратко объясняет разницу. (Обратите внимание, что первая часть «ответа», данного в вопросе, неверна.) Возможно, вам здесь нужно Dictionary<Guid,SomeObject>, а не List<SomeObject>. - person Zooba; 03.10.2010

Они могут делать то же самое в зависимости от данных в вашем списке. ReplaceItemPropertyValue2 использует метод Single, который вызовет исключение, если itemUnqiueKey не найден или найден более одного раза.

Но пока itemUniqueKey не может появляться в списке более одного раза, две функции должны выполнять одну и ту же задачу.

person Matthew Manela    schedule 03.10.2010

Оба могут быть одинаковыми.

Алгоритм в цикле for устанавливает объект, когда ключ совпадает, а затем прерывается.

В то время как оператор LINQ установит объект для всех записей, ключ которых совпадает. Это зависит от того, был ли в вашей коллекции один и тот же ключ введен более одного раза.

person Nayan    schedule 03.10.2010