Домашнее задание: Как получить несколько ключей? - PullRequest
0 голосов
/ 24 января 2011

у меня

public class Letter
{
    public string Value;
    public int Id;

    public Letter(string val, int id)
    {
        this.Value = val;
        this.Id = id;
    }
}

Мне нужен своего рода дубликат словаря (LookUp (?)) Для:

private something TestCollection()
{
    List<Letter> inputList = new List<Letter> { 
        new Letter("a", 9), 
        new Letter("b", 5), 
        new Letter("c", 8), 
        new Letter("aIdentic", 9) 
    };

    // compare inputList by letter's ID(!)
    // use inputList (zero based) INDEXES as values

    // return something, like LookUp: { "a"=>(0, 3), "b"=>(1), "c"=>(2) };

}

с использованием .NET 4

Как его получить?

Как я понял, есть 2 решения, одно из .NET 4, Lookup<Letter, int>, другое, классическое Dictionary<Letter, List<int>>

спасибо.

EDIT:

Для вывода. В массиве 2 буквы «а», идентифицируемые идентификатором 9 по индексу «0» (первая позиция). «b» имеет индекс 1 (вторая позиция во входном массиве), «c» - индекс 2 (третий).

РЕДАКТИРОВАТЬ 2

Джон решение:

    public class Letter
    {
        public string Value;
        public int Id;

        public Letter(string val, int id)
        {
            this.Value = val;
            this.Id = id;
        }
    }

    private void btnCommand_Click(object sender, EventArgs e)
    {
        List<Letter> inputList = new List<Letter> { 
            new Letter("a", 9), 
            new Letter("b", 5), 
            new Letter("c", 8), 
            new Letter("aIdentic", 9) 
        };

        var lookup = inputList.Select((value, index) =>
            new { value, index }).ToLookup(x => x.value, x => x.index);

        // outputSomething { "a"=>(0, 3), "b"=>(1), "c"=>(2) };
        foreach (var item in lookup)
        {
            Console.WriteLine("{0}: {1}", item.Key, item.ToString());
        }

    }

Вывод (я ожидаю не более 3 ключей):

//WindowsFormsApplication2.Form1+Letter: System.Linq.Lookup`2+Grouping[WindowsFormsApplication2.Form1+Letter,System.Int32]
//WindowsFormsApplication2.Form1+Letter: System.Linq.Lookup`2+Grouping[WindowsFormsApplication2.Form1+Letter,System.Int32]
//WindowsFormsApplication2.Form1+Letter: System.Linq.Lookup`2+Grouping[WindowsFormsApplication2.Form1+Letter,System.Int32]
//WindowsFormsApplication2.Form1+Letter: System.Linq.Lookup`2+Grouping[WindowsFormsApplication2.Form1+Letter,System.Int32]

РЕДАКТИРОВАТЬ 3 равно

public override bool Equals(object obj)
{
    if (obj is Letter)
        return this.Id.Equals((obj as Letter).Id);
    else
        return base.Equals(obj);
}

public override int  GetHashCode()
{
    return this.Id;
}

1 Ответ

1 голос
/ 24 января 2011

Lookup, вероятно, является правильным классом для использования здесь - и LINQ позволяет вам создать класс с ToLookup. Обратите внимание, что Lookup был представлен в .NET 3.5, а не .NET 4.

Сказав это, не совсем понятно, как вы перейдете от своего ввода к выходу сэмпла ...

РЕДАКТИРОВАТЬ: Хорошо, теперь, когда я понимаю, что вы после индекса, вы можете использовать перегрузку Select, которая сначала включает индекс:

var lookup = inputList.Select((value, index) => new { value, index })
                      .ToLookup(x => x.value.Id, x => x.index);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...