【问题标题】:Linq ToDictionary() ImplementationLinq ToDictionary() 实现
【发布时间】:2015-05-11 15:02:12
【问题描述】:

我的列表如下:

List<Person> people = new List<Person>()
{
    new Person() { FirstName = "Bob",LastName="test",EMPID="1234" },
    new Person() { FirstName = "Bob",LastName="t",EMPID="1234" },
    new Person() { FirstName = "Jane",LastName="test",EMPID="1234" },
    new Person() { FirstName = "Jane",LastName="t",EMPID="1234" }
};

如果添加 FirstName 和 LastName,这里所有的人员字段都是唯一的。

如果我使用

  Dictionary<string, Person> dictionary = people.ToDictionary(v => v.FirstName); 

然后我会得到项目已经存在的异常。

甚至我也不能使用 LastName。

所以我需要使用 FirstName 和 LastName 的组合,并且该值可以保存为 FirstName;#LastName 在字典键中

我是 C# 开发的新手

任何建议都非常有帮助。

问候

阿南德

【问题讨论】:

  • 让您的EMPID 独一无二,这应该是它的初衷。
  • 我怎么能或应该问为什么 2 个不同的员工共享相同的 EMPID..

标签: c# linq dictionary


【解决方案1】:

您可以在 LINQ 委托中使用各种表达式。 试试

 Dictionary<string, Person> dictionary = people.ToDictionary(v => v.FirstName + ";#" + v.LastName);

【讨论】:

  • 这允许具有不同名称的用户之间发生潜在的冲突。
  • @Servy 你确定吗?如果它们有不同的名称(就像 OP 假设的那样),那么生成的键肯定是不同的。
  • Glorfindel,我认为 OP 的假设肯定是错误的,(即 John Smith 很常见等)
  • @Glorfindel 名称 {"A;#B","C"} 和 {"A", "B#;C"} 将在您的解决方案中相互冲突,尽管它们是不同的。再加上 Sayse 的观点,首先名字不一定是人的唯一标识符。
  • @Glorfindel 首先,SQL 注入攻击的全部寓意不是净化输入,而是连接代码以便字符串实际上被视为数据,而不管其内容如何。而不是将字符串连接在一起,您应该编写一个不关心字符串是什么的解决方案,并且可以支持任何字符串,无论它们有或没有什么字符。这样做很简单。
【解决方案2】:

如果您找不到唯一的键(或不想将该键用于字典),除了IDictionary&lt;TKey, TValue&gt;.,还有其他选择

例如,您可以创建一个查找:

people.ToLookup(v => v.FirstName);

查找接受每个键有多个匹配项(实际上这是它的唯一目的)。然后可以像字典一样访问它,但它会返回一个枚举而不是单个值:

var lookup = people.ToLookup(v => v.FirstName);
var johns = lookup["John"];
foreach (var john in johns)
{
    Debug.WriteLine(john.ToString());
}

您也可以使用 linq 的 GroupBy 扩展,其目的与查找密切相关,但迭代不同。另外,您可以在迭代时发现键(在需要提前知道键的查找中,情况并非如此):

var groups = people.GroupBy(v => v.FirstName);
foreach (var grp in groups)
{
    var key = grp.Key;
    foreach (var person in grp)
    {
        Debug.WriteLine(person.ToString());
    }
}

【讨论】:

  • 我认为您误解了 GetHashCode 的用途 - read the docs。它不必是唯一的,任何两个相同的都不能保证相等。它与您尚未覆盖的Equals 一起使用。而且似乎都与问题无关。
  • 感谢您的回复我帮了我很多忙
猜你喜欢
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多