у меня
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;
}