有人可以教我如何在C#中按字母顺序将项目插入列表吗?
因此,每次我添加到列表中时,我都希望在列表中添加一个项目,理论上该列表可能会变得非常大。
示例代码:
Public Class Person
{
public string Name { get; set; }
public string Age { get; set; }
}
Public Class Storage
{
private List<Person> people;
public Storage
{
people = new List<Person>();
}
public void addToList(person Person)
{
int insertIndex = movies.findindex(
delegate(Movie movie)
{
return //Stuck here, or Completely off Track.
}
people.insert(insertIndex, newPerson);
}
}
答案 0 :(得分:9)
定义比较器实现IComparer<T>
Interface:
public class PersonComparer : IComparer<Person>
{
public int Compare(Person x, Person y)
{
return x.Name.CompareTo(y.Name);
}
}
然后使用SortedSet<T>
Class:
SortedSet<Person> list = new SortedSet<Person>(new PersonComparer());
list.Add(new Person { Name = "aby", Age = "1" });
list.Add(new Person { Name = "aab", Age = "2" });
foreach (Person p in list)
Console.WriteLine(p.Name);
如果您仅限于使用.NetFramework3.5,则可以使用SortedList<TKey, TValue>
Class:
SortedList<string, Person> list =
new SortedList<string, Person> (StringComparer.CurrentCulture);
Person person = new Person { Name = "aby", Age = "1" };
list.Add(person.Name, person);
person = new Person { Name = "aab", Age = "2" };
list.Add(person.Name, person);
foreach (Person p in list.Values)
Console.WriteLine(p.Name);
仔细阅读MSDN artcile中的备注部分,比较此课程与SortedDictionary<TKey, TValue>
Class
答案 1 :(得分:4)
如果您绝对希望使用列表,请尝试以下操作:
int loc;
for(loc = 0; loc < people.Count && people[loc].Name.CompareTo(personToInsert.Name) < 0; loc++);
people.Insert(loc, personToInsert);
您可以将people[loc].Name.CompareTo(personToInsert.Name) < 0
替换为您正在测试的条件 - 并且您可以更改符号以使其降序而不是升序。例如people[loc].Age < personToInsert.Age
就像按年龄排序一样。
答案 2 :(得分:4)
旧线程,但这个线程IMO的答案忽略了OP的实际问题。问题很简单 - 如何按排序顺序插入列表。这与“只使用SortedSet / SortedList”不同。基于使用以下与使用SortedList,将有不同的特征和含义。
SortedSet和SortedList都基于Dictionary,并且不允许您使用相同的键AFAIK添加两个项目。
那你如何考虑{a,b,c,c,d}之类的清单?
以下是插入有序列表的正确方法,以便项目保持有序:
var binarySearchIndex = list.BinarySearch(item, itemComparer);
//The value will be a negative integer if the list already
//contains an item equal to the one searched for above
if (binarySearchIndex < 0)
{
list.Insert(~binarySearchIndex, item);
}
else
{
list.Insert(binarySearchIndex, item);
}
通过2010年的这篇精彩文章回答:https://debugmode.net/2010/09/18/inserting-element-in-sorted-generic-list-list-using-binary-search/
答案 3 :(得分:2)
看看SortedSet<T>
课程。只需使用它而不是List<T>
。
答案 4 :(得分:2)
SortedList
是您需要的。创建一个StringComparer对象并将其传递给sortedlist的构造函数。元素会在插入新项目时自动排序。
StringComparer stringComp = StringComparer.CurrentCulture;
SortedList sl = new SortedList(stringComp);
sl.Add("B", "SECOND");
sl.Add("A", "FIRST");
sl.Add("C", "THIRD");