一个对列表,其中一些等于键/值?

时间:2012-07-17 15:07:50

标签: c# linq data-structures

我需要一个配对列表,带有“string”,“string”。

试过:

Dictionary<string, string> Categories= new Dictionary<string, string>();

但不能添加“700”,“2”和“700”,“3”。我需要一个配对,我可以随时添加所有东西。像一个可以包含N Vector(字符串,字符串)的Vector。我需要哪种结构?很快,因为我需要在LINQ中对它们进行比较,之后:

myStructs = from MyObject s in MyObjects
               join c in Categories on s.IDCategory.UniqueID equals c.Key
               join d in Categories on s.Stars equals d.Value
               select s;

5 个答案:

答案 0 :(得分:9)

尝试List<Tuple<string, string>>,或者为了提高可读性,只需创建一个新类型。

如果你需要它在linq中有意义,你可以将元组转换为匿名类型(在这里使用let)给类型一些合理的属性名称:

var items = new List<Tuple<string, string>>
    {
        new Tuple<string, string>("Adam", "1"), 
        new Tuple<string, string>("Adam", "2")
    };

var names = from i in items
            let person = new { Name = i.Item1, Number = i.Item2 }
            select person.Name;

在linq查询期间使其更具可读性。

类型被大量使用,我建议使用更好的属性名称创建自己的类型,以便在Servy's answer中更清晰。从长远来看,Tuple<string, int, bool> 要少得多

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public bool LikesCake { get; set; }
}

元组相等性基于所有属性与相同类型元组的实例的相等性。例如,new Tuple("Adam", "1").Equals(new Tuple("Adam", "1"))将为真。

列表也不会停止重复的项目。如果您需要在所有属性中强制实施唯一性,那么HashSet<Tuple<string, string>>就是您所需要的。

答案 1 :(得分:4)

只需创建自己的。

public class Pair
{
  public string First {get;set;}
  public string Second {get;set;}
}

然后,您可以使用List<Pair>来保存数据。

有几种可能的库类可以根据自己的需要重新定位,但特别是如果这对实际代表某些东西(意味着你将类和属性重命名为更有意义的东西)那么它可以将它放在自己的类中以表示它是有用的。如果您确实想重新使用现有类型,那么Tuple<string,string>可能是最佳选择。

答案 2 :(得分:0)

尝试使用List<KeyValuePair<string, string>>

答案 3 :(得分:0)

Dictionary是一个散列的位置键,因此您不能在字典中包含重复项。您可以使用<string,string>KeyValuePair

列出Tuple类型的列表

答案 4 :(得分:0)

如果您使用的是.NET 3.5或更低版本,则List<KeyValuePair<string, string>>可能会运行良好,如果为4或更高版本,List<Tuple<string, string>>将成为赢家。