我的class
对象中有一个dictionary
,如下所示:
class MyClass
{
Dictionary<string, string> Things {get; set;}
}
现在我想首先要做一些特别的事情,然后如果有更多的成员接受其余部分并在其余部分做其他事情
我见过Select
语句的一些语法,我们可以通过&#34;索引&#34;到Select
,我试图想出来,但没有运气。
你会怎么做?
我写的所有内容都是这样的:
var temp = myClassObject.Things.Select((t,i) => t.Vale);
我想我可以使用.First
和Skip(1)
更长时间地编写它。
答案 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)
正如其他答案所述,词典中的项目没有已定义的顺序,您不应该依赖字典来按照添加项目的顺序返回项目。如果这确实是您需要的,我强烈建议您重新考虑您选择的数据结构。
但是,由于您说不想要使用First
或Skip
,您可以改为使用原始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
}
}
}
说实话,我可能不会在我自己的代码中这样做;我只是提供另一种选择。