【问题标题】:idictionary help filtering items字典帮助过滤项目
【发布时间】:2011-08-18 14:06:18
【问题描述】:

有没有更好的方法来编写Where这个:

    IDictionary<string, string> p = new Dictionary<string, string>();
    p.Add("Apple", "1");
    p.Add("Orange", "2");
    p.Add("Pear", "3");
    p.Add("Grape", "4");
    p.Add("Pineapple", "5");
    //This is a unique list

    var retVal = p.Where(k => k.Key.Contains("Apple") || k.Key.Contains("Pear") || k.Key.Contains("Grape"));

下面的一些历史

我有一个字符串字典,如下所示:

IDictionary<string,string>

内容如下:

Apple,1
Orange,2
Pear,3
Grape,4
...many more

我怎样才能像这样只从我的字典中返回一些项目

if (true)
{
  //return only 3 apple,pear&grape items out of the dozens in the list into a new variable
}

【问题讨论】:

  • ...这不是过滤,而是“采取”3 个项目。还是这样?
  • 您想退回哪三样东西?有很多方法可以只返回 3 个项目:基于索引顺序的前 3 个、基于字母顺序的前 3 个、随机 3 等。此外,“返回”是指作为方法调用的结果返回吗?
  • @xtofl 和 @squillman 请参阅上面的更新。谢谢。
  • @squillman - 我想把这三个项目绑定到我的下拉列表中

标签: c#


【解决方案1】:

您可以只拿前 3 件物品...

theDictionary.Take(3);

或过滤并获取特定项目...

string[] itemsIWant = { "Apple", "Pear", "Grape" };

theDictionary.Where(o => itemsIWant.Contains(o.Key));

或者随机排序,取3个...

Random r = new Random();

theDictionary.OrderBy(o => r.Next()).Take(3);

【讨论】:

  • 请查看我的 3 个特定项目(不再是随机的)抱歉造成混淆
  • @rod:我已经更新了我的答案,但你这样做的方式已经“很好”。
【解决方案2】:

这实际上取决于您想要实现的过滤类型。但是你可以通过 Linq 来实现。

如果你只想获取前 3 项,你可以这样做:

theDictionary.Take(3);

如果您想获取以“G”开头的前 3 个项目,您将执行以下操作:

theDictionary.Where(kv => kv.Key.StartsWith("G")).Take(3);

如果您想获取以“G”开头的前 3 个项目(不考虑大小写),您将执行以下操作:

theDictionary.Where(kv => kv.Key.ToLower().StartsWith("g")).Take(3);

最后但同样重要的是,如果你想随机获得 3 件物品,你会这样做:

Random rand = new Random();
theDictionary.OrderBy(kv => rand.Next()).Take(3);

【讨论】:

  • 这个答案实际上是早期答案的精确副本,没有额外的价值或细节。
  • @Anthony 作为一个有经验的用户,您可能知道在 SO 中事情发生得很快。你认为我花了多少时间写下我的答案?您是否意识到@Josh 首先写了一个非常简短的答案?所以我决定写一个代码更多,更完整的。然后乔希也完成了他的回答。您认为过滤一个字典有多少个“不同的正确答案”?
  • 另外,初学者通常并不真正知道如何使用 lambda 表达式(Key/Value 结构)来处理 IDictionary。我发布的代码也表明了这一点。
  • @all - 请查看我的 3 个特定项目(不再是随机的)抱歉造成混淆
  • @rod 你还需要更具体一些。列表中可以有多个“Apple”吗?
【解决方案3】:

【讨论】:

  • 他需要过滤吗?有什么问题:/
  • 是的,假设 OP 想要一个字典,这里的所有其他答案都返回一个 IEnumerable;因此,OP 可能希望以.ToDictionary(x =&gt; x.Key, x =&gt; x.Value) 结束他的.Take(3).Where(...)。 +1 建议。
猜你喜欢
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 2010-11-14
  • 1970-01-01
相关资源
最近更新 更多