Кто-то, пожалуйста, проясните этот бизнес IEnumerable <T>для моего приложения MVC? - PullRequest
1 голос
/ 26 августа 2009

ОК, так что давайте, один из моих классов под названием Product реализован так:

namespace DomainModel.Entities
{
    public class Product
    {
        public int ProductID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }

    }
}

Я хочу добавить IEnumerable, чтобы он содержал список значений, которые я могу позже просмотреть в своем представлении. Как, черт возьми, я делаю это, и почему пример кода MSDN настолько запутан (это мне совсем не помогает, и у меня такое ощущение, что это намного проще, чем это) ?? (СМ. НИЖЕ)

using System;
using System.Collections;

public class Person
{
    public Person(string fName, string lName)
    {
        this.firstName = fName;
        this.lastName = lName;
    }

    public string firstName;
    public string lastName;
}

public class People : IEnumerable
{
    private Person[] _people;
    public People(Person[] pArray)
    {
        _people = new Person[pArray.Length];

        for (int i = 0; i < pArray.Length; i++)
        {
            _people[i] = pArray[i];
        }
    }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return new PeopleEnum(_people);
        }
}

public class PeopleEnum : IEnumerator
{
    public Person[] _people;

    // Enumerators are positioned before the first element
    // until the first MoveNext() call.
    int position = -1;

    public PeopleEnum(Person[] list)
    {
        _people = list;
    }

    public bool MoveNext()
    {
        position++;
        return (position < _people.Length);
    }

    public void Reset()
    {
        position = -1;
    }

    public object Current
    {
        get
        {
            try
            {
                return _people[position];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
}

class App
{
    static void Main()
    {
        Person[] peopleArray = new Person[3]
        {
            new Person("John", "Smith"),
            new Person("Jim", "Johnson"),
            new Person("Sue", "Rabon"),
        };

        People peopleList = new People(peopleArray);
        foreach (Person p in peopleList)
            Console.WriteLine(p.firstName + " " + p.lastName);

    }
}

/* This code produces output similar to the following:
 *
 * John Smith
 * Jim Johnson
 * Sue Rabon
 *
 */

Ответы [ 4 ]

5 голосов
/ 26 августа 2009

Что не так с List<Person>?

0 голосов
/ 26 августа 2009

Если все, что вы хотите сделать, это добавить группу людей (за один раз), то, безусловно, достаточно:

namespace DomainModel.Entities
{
    public class Product
    {
        public int ProductID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
        public IEnumerable<Person> People { get; set; }
    }
}

Это несколько глупо, потому что вы должны назначать людей за один раз. Вместо этого вы могли бы сделать это фактической изменчивой коллекцией, такой как List, или предоставить метод AddPerson (), чтобы скрыть это (возможно, обрабатывать добавление одного и того же человека более одного раза)

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

Использование (очень) простого предложения, приведенного выше, без какой-либо базы данных / отображения базы данных будет таким простым:

public Product GetExampleProduct()
{
    return new Product() {
        ProductID = 1,
        Name = "SkeetOMatic",
        Description = "your very own Skeet in a box",
        Price = Double.PositiveInfinity,
        People = new[] { new Person("Joel"), new Person("Jeff") } 
    };
}

Простое использование подходящих внешних ключей в вашей базе данных и использование дизайнера Linq должно позволить вам заметить эту связь и позволить Linq обрабатывать все эти вопросы. Тогда, если вы попросите людей, связанных с этим продуктом, вы получите их в значительной степени автоматически.

0 голосов
/ 26 августа 2009

Вы не выглядите так, как будто вам нужно продлить IEnumerable

Попробуйте что-то вроде этого:

static void Main()
{
    var peopleArray = new IEnumerable<Person>
    {
    new Person("John", "Smith"),
    new Person("Jim", "Johnson"),
    new Person("Sue", "Rabon"),
    };

    foreach (var p in peopleArray)
    { 
        Console.WriteLine(p.firstName + " " + p.lastName);
    }
}
0 голосов
/ 26 августа 2009

Вы должны попробовать использовать список вместо того, что вы используете в настоящее время:

  List<Product> products = new List<Product>();
...