IEnumerable - мой метод расширения - PullRequest
0 голосов
/ 05 мая 2011
public static Record FindOrCreate(this IEnumerable<Record> ienumerable, string name)
{

        if (ienumerable.Where(element => element.Name == name).FirstOrDefault() != null)
            return ienumerable.Where(element => element.Name == name).FirstOrDefault();
        else
        {
            IEnumerable<Record> result = ienumerable.Concat(new[] {new Record(name, "")});
            ienumerable = result;
            return ienumerable.Where(element => element.Name == name).FirstOrDefault();
        }
}

Я знаю, что в IEnumerable нет метода Add, но я хочу остаться с IEnumerable вместо ICollection, и в очень редких случаях мне нужно что-то добавить.Мой метод всегда возвращает ноль, если не находит элемент.

Код отредактирован!Итак, теперь в результате есть все элементы, которые я хочу, но метод все еще возвращает нулевой объект.Я не знаю, возможно ли переключать объекты в методах расширения?(как я сделал ienumerable = result)?

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Я думаю, вы пытаетесь согнуть IEnumerable<T> за пределы его цели.

IEnumerable<T> - это просто последовательность элементов, и поэтому IEnumerable<T> не имеет метода Add<T> в своем интерфейсе. Это только для чтения.

Я бы порекомендовал изменить реализацию вашего метода расширения.

1 голос
/ 05 мая 2011

Итак, вопрос в том, «как я могу изменить код, чтобы он не возвращал ноль, если элемент не найден, но возвращает новый элемент»?

public static Record FindOrCreate(this IEnumerable<Record> source, string name)
{
    Func<Record,bool> pred = element => element.Name == name;
    return source.Any(pred) ? source.FirstOrDefault(pred) : new Record(name, "");
}

или

public static Record FindOrCreate(this IEnumerable<Record> source, string name)
{
    return source.FirstOrDefault(element => element.Name == name) ?? new Record(name, "");
}

Если вопрос «как я могу добавить новый элемент в IEnumerable<Record> source, то короткий ответ будет невозможен. Чем дольше ответ, приведите источник к ICollection, а затем добавьте его. Но в этот момент, вы также можете просто указать, что вам нужно ICollection<T>

Примечание. Я не имею в виду «вы не должны», когда я говорю «вы не можете», действительно, IEnumberable не имеет никакого способадобавить элементы. Подумайте о том, что значит попытаться добавить новый номер к следующему seq

public IEnumerable<int> ShortSeq()
{
    yield return 0;
}
var seq = ShortSeq();
...