C#获取列表<object>将不同的id和值作为字典(列表中的重复项)

时间:2015-06-22 14:35:18

标签: c# dictionary

我们假设我有一个班级:

public class Demo
{
   public string Id { get; set; }
   public string Value { get; set; } 
}

然后是演示列表

List<Demo> demo = new List<Demo>();

该列表包含许多项目,其中许多都是重复项。

例如

 Item1:
     Id= 1;
     Value = "Something"

 Item2:
     Id= 2;
     Value = "Something else"

 Item3:
     Id= 3;
     Value = "Something else in here"

 Item4:
     Id= 1;
     Value = "Something"

................

 ItemN:
     Id= 2;
     Value = "Something else"

如上所示,几乎没有相同的项目(相同的ID和值)。

现在我需要的是将其转换为Dictionary<string,string>,显然可以摆脱重复。

BTW Id是定义项目副本的字段。

编辑:

我已尝试按ID对列表进行分组,但我也不知道如何获取该值并使其成为词典

var grouped= demo.GroupBy(t => t.Id).ToList();

现在我可以grouped.Key我有ID,但我怎么能得到这个值?

4 个答案:

答案 0 :(得分:1)

我建议使用t(w %*% t(as.matrix(testset[,2:29]))) - svm.model$rho

            V1          V2          V3          V4          V5
1   3191    172.58302   -1527.0875  -1301.15106 -767.5058   3451.69551
2   2159    1199.02091  -1782.2845  -1362.27901 -2257.9054  4132.92307
3   4295    1557.35203  -2374.2095  -1581.37368 -3601.2268  5963.68623
4   3843    433.74900   -1091.0102  -1296.25825 -1285.6248  3217.86395
5   4448    1184.22539  -1515.8411  -1708.36731 -2612.3417  4621.73283

现在,您可以通过以下方式获取给定Lookup<TKey, TValue>的所有项目:

var idLookup = demo.ToLookup(d => d.Id);

如果它不包含此Id,则序列为空(ID)。

如果您想要不同ID的数量:

IEnumerable<Demo> demoWithId2 = idLookup["2"];

如果您想要每个ID的值数:

demoWithId2.Any() == false

如果您希望int numberOfDistinctIDs = idLookup.Count; 为每个ID设置一个任意对象(第一个):

int numberOfDemoWithId2  = idLookup["2"].Count();

答案 1 :(得分:0)

  

只是ID,值是99.9%相同,但你永远不知道   ID是检查它是否重复的ID

使用GroupBy根据Id获取不同的值,然后从组中获取第一个对象,并在ToDictionary中获取其值,如:

Dictionary<string, string> dictionary = demo.GroupBy(d => d.Id)
                    .ToDictionary(grp => grp.Key, grp => grp.First().Value);

这将从第一个分组元素中获取Value

答案 2 :(得分:0)

请试试这个......

lst.GroupBy (l => l.Id)
    .Select (g => lst.First (l => l.Id==g.Key))
    .ToDictionary (l => l.Id, l=>l.Value);

答案 3 :(得分:0)

您可以让Demo类继承自IEquatable并让其实施Equals()GetHashCode(),如下所示:

public class Demo : IEquatable<Demo>
{
    public string Id { get; set; }
    public string Value { get; set; }

    public bool Equals(Demo other)
    {
        if (ReferenceEquals(other, null)) 
            return false;
        if (ReferenceEquals(this, other)) 
            return true;
        return other.Id == Id;
    }

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

这样您就可以在.Distinct()上致电List,然后转换为Dictionary,如下所示:

List<Demo> demo = new List<Demo>
{
    new Demo { Id = "1", Value = "Something" },
    new Demo { Id = "2", Value = "Something else" },
    new Demo { Id = "3", Value = "Something else in here" },
    new Demo { Id = "1", Value = "Something" },
};

Dictionary<string, string> demoDictionary = demo.Distinct().ToDictionary(d => d.Id, d => d.Value);
demoDictionary.Keys.ToList().ForEach(k => Console.WriteLine("Key: {0} Value: {1}", k, demoDictionary[k]));

结果:

Key: 1 Value: Something
Key: 2 Value: Something else
Key: 3 Value: Something else in here