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

本文关键字:获取 成员 然后 Dictionary 第一个 | 更新日期: 2023-09-27 18:17:44

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

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

现在我想让第一件事对它做一些特别的事情然后如果它有更多的成员取剩下的对剩下的做一些其他的事情

我已经看到了Select语句的一些语法,我们可以传递一个"索引"到Select,我试图找出它,但没有运气。你会怎么做呢?

我写的都是这样的:

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

我想我可以用.FirstSkip(1)把它写得更长一些。

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

如果必须依赖于特定的顺序,则不应使用字典。它们用于按键快速查找值。但是,只要不删除条目,当前实现将保留插入顺序。

所以你可以把它当作一个集合,并使用Take(或First,如果你想停止查询)和Skip:

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

我建议为这个

引入一个元组
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);

正如我在评论中所说,字典是无序的,所以获取"First"项可能会给你不一致的结果。

也就是说,它确实实现了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>>如果你想保持一些字符串值与行相关联)。主要的区别是获取项会更慢(慢多少取决于数据量)

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

然而,既然你说你不想使用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
        }
    }
}

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