Итерация по обобщенному c Lookup - PullRequest
0 голосов
/ 13 февраля 2020

Я хочу передать шаблон c Lookup<type1, type2> объекту. В этом объекте я хочу перебрать общий поиск c при обращении к указанным c свойствам. Как я могу это сделать?

Для меня тоже подойдет другой подход. У меня есть Enumerable<type>, который я должен сгруппировать по любому свойству (вот почему я выбрал Lookup). В целевом объекте я должен выполнить групповую итерацию по этой коллекции, а затем выполнить итерацию по каждой группе, выбирая определенные c свойства type.

class Record
{
    public DateTime RecordDate {get; set;}
    public string Info1 {get; set;}
    public string Info2 {get; set;}
}

class TargetObject<type1, type2>
{
    public Lookup<type1, type2> myLookup;
    public TargetObject(Lookup<type1, type2> lookup)
    {
        myLookup = lookup;
    }

    public void TestFunc()
    {
        foreach(var item in myLookup)
        {
            var x = item.Key;
            foreach(var subItem in item)
            {
                var y = subItem. //here i like to acces type2-specific properties like Record.Info2 in a generic way
            }
        }
    }
}

List<Record> records = new List<Record>();
Lookup<DateTime, Record> lookup = records.ToLookup(r => r.RecordDate);

var target = new TargetObject(lookup);

1 Ответ

1 голос
/ 13 февраля 2020

// здесь я хотел бы получить доступ к свойствам типа 2 c, таким как Record.Info2, в общем случае c способ

Проблема в том, что если вы действительно универсальный c, вы не знаете, что это за свойства. По этому вопросу, мы тоже. Что вы хотите сделать эти данные? Кажется, ты не узнаешь этот ответ заранее.

Но есть и хорошие новости ... которые делают это идеальным вариантом использования для делегата!

public void TestFunc(Action<type1, type2> doSomething)
{
    foreach(var item in myLookup)
    {
        var x = item.Key;
        foreach(var subItem in item)
        {
            doSomething(x, subItem);
        }
    }
}

И теперь вы бы назвали его лямбдой, например:

var target = new TargetObject(lookup);
target.TestFunc((x, y) => {
    // x is the key
    // y is the subitem
    // Whatever code you put here will run once for every subitem.
    // And you will be able to use properties and methods of y.
    // As a bonus, you also have access to variables in outer scope via closures.
});
...