获取Dictionary的第一个成员,然后获取其余成员

时间:2014-08-11 21:27:15

标签: c# linq

我的class对象中有一个dictionary,如下所示:

class MyClass
{
  Dictionary<string, string> Things {get; set;}
}

现在我想首先要做一些特别的事情,然后如果有更多的成员接受其余部分并在其余部分做其他事情

我见过Select语句的一些语法,我们可以通过&#34;索引&#34;到Select,我试图想出来,但没有运气。 你会怎么做?

我写的所有内容都是这样的:

var temp = myClassObject.Things.Select((t,i) => t.Vale);

我想我可以使用.FirstSkip(1)更长时间地编写它。

4 个答案:

答案 0 :(得分:3)

如果您必须依赖特定订单,则不应使用词典。它们用于快速通过键查找值。但是,只要您不删除current implementation preserves the insertion order

条目

因此,您可以将其视为一个集合并使用Take(或First,如果您想停止查询)和Skip

var firstThing   = Things.Take(1);  // or First()
var restOfThings = Things.Skip(1);

答案 1 :(得分:2)

正如我在评论中所说,词典没有订购,因此获取“第一”项可能会给你带来不一致的结果。

那说,它确实实现了IEnumerable<KeyValuePair>,所以你可以做:

string firstItem = myClassObject.Things.First().Value;
IEnumerable<string> theRest = myClassObject.Things.Skip(1).Select(kvp => kvp.Value);

如果您希望按照添加顺序保留这些项目,则List<string>更合适(如果您想保留与该行关联的字符串值,则为List<Tuple<string, string>>) 。主要区别在于获取项目会更慢(慢慢多少取决于数据量)

答案 2 :(得分:2)

我建议在这个

中引入一个元组
Dictionary<string, Tuple<string,int>> Things {get; set;}

然后在构建数据时,而不是仅仅使用

Things["Hello"] = "World";

您将使用从0开始的计数器

Things["Hello"] = new Tuple<string,int>("World",counter++);

这将允许您稍后查看第一行

var first = Things.OrderBy(k => k.Value.Item2).First();

var rest = Things.OrderBy(k => k.Value.Item2).Skip(1);

答案 3 :(得分:0)

正如其他答案所述,词典中的项目没有已定义的顺序,您不应该依赖字典来按照添加项目的顺序返回项目。如果这确实是您需要的,我强烈建议您重新考虑您选择的数据结构。

但是,由于您说想要使用FirstSkip,您可以改为使用原始IEnumerator

using (var enumerator = myClassObject.Things.GetEnumerator())
{
    if (enumerator.MoveNext())
    {
        var firstPair = enumerator.Current;
        // Handle first pair

        while (enumerator.MoveNext())
        {
            var pair = enumerator.Current;
            // Handle subsequent pairs
        }
    }
}

说实话,我可能不会在我自己的代码中这样做;我只是提供另一种选择。