Быстрый вопрос: C # Linq "Одиночный" оператор против "для" цикла - PullRequest
2 голосов
/ 03 октября 2010

Мне нужно немного разъяснений. Эти два метода одинаковы или различны? Я немного запутался, когда обновляется ссылка на объект, переданный в параметре по значению, и когда создается новый. Я знаю, создает ли это назначение новую ссылку, но как насчет изменения свойства? Будут ли оба эти метода обновлять поле "_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;
    }
}

Ответы [ 3 ]

2 голосов
/ 03 октября 2010

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

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


  1. «rvalue» на самом деле не является коротким для «возвращаемого значения», просто случается, что в этом случае ваше rvalue является возвращаемым значениемИменно поэтому я указал оба варианта.
0 голосов
/ 03 октября 2010

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

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

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

0 голосов
/ 03 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...