【问题标题】:Check if List<List<double>> Contains Specific Value in first postition检查 List<List<double>> 是否在第一个位置包含特定值
【发布时间】:2017-05-10 04:08:54
【问题描述】:

我有一个List&lt;List&lt;double&gt;&gt; items,其中每个内部列表都包含一对双精度,其中[0] == PRICE[1] == QTY

我想检查 (TRUE/FALSE) 列表是否包含具有特定 PRICE 值的行。除了使用foreach(可能使用LINQ)循环整个列表之外,还有更快的方法吗?还是只检查第一个值的特殊类型的“.Contains()”方法?

"items": [
  [
     241.947,
     155.91626
  ],
  [
     241,
     981.1255
  ],
[
     240.744,
     21.1255
  ],
],

【问题讨论】:

  • 你能提供关于这个的示例 json
  • 无论你使用什么方法,你都必须遍历列表。如果您想要一种快速的方法,请使用不同的数据结构,也许是哈希表。
  • 为什么不使用 List 来表示这对双打,为什么不直接使用包含两个属性(价格和数量)的结构或类。还是我误解了这个问题。
  • LINQ 并不神奇——如果您有一个无序的元素集合并且您需要查看某个元素是否为真,您将迭代该列表。您可以构建基于 列表的数据结构以实现更快的搜索,但如果您打算对数据做的唯一事情是搜索,那么您将花费更多时间在构建结构以实现更快的搜索和搜索而不是单独的线性搜索。

标签: c# list nested contains


【解决方案1】:

假设你的意思是,(看到你的例子应该是这种情况)每个内部列表都包含两个值 - 第一个是价格,第二个是数量,你想要这样的东西:

  List<List<double>> items = new List<List<double>>();
  var result = items.Any(innerList => innerList[0] == yourValue);

如果有任何内部列表的第一个值设置为您的价格,则查询返回 true。

编辑1:

因为您使用的是双精度数,您甚至可能希望检查具有较小容差的值:

  List<List<double>> items = new List<List<double>>();
  var result = items.Any(innerList => Math.Abs(innerList[0] - yourValue) < someReallySmallTolerance);

编辑2: 关于您的性能问题,linq 查询不太可能比简单的 foreach(或 for 循环)更快,但您可以轻松测试它。如果你真的要在这里赢得性能,你可能需要更好的数据结构。

【讨论】:

  • +1。查找在哈希集中是 O(1),但在最初将数据转换为集合时,有人无意中听到。查找代码需要检查一个大型数据集,或者需要严格的性能要求才能使开销和增加的复杂性值得。
  • @AustinDrenski 数据的大小不如他计划用数据做什么重要 - 从列表构建一个集合需要线性时间,如果唯一您打算在列表上执行的操作是单个线性时间操作(例如此搜索),无论如何,构建新集合没有任何好处。另一方面,如果他需要多次执行相同的操作,那么创建一个通过“价格”和“数量”进行恒定时间查找的数据结构显然有好处。
  • @PrestonGuillot 你是对的。我应该更仔细地措辞。目的是对您的(更清晰的)评论提出类似的观点,但我似乎写的是“大型数据集”而不是“针对数据集的大量查找”。
【解决方案2】:

您可以使用Any 和 Contains 的组合来执行此检查;

List<List<double>> items = new List<List<double>>();

items.Add(new List<double>(){12.5,3.4,4.5,56.7,11.3,10.7});
items.Add(new List<double>(){122.5,123.4,122.7,256.7,411.3,410.7});

double itemToCheck = 1222.7;

if(items.Any(x=>x.Contains(itemToCheck)))
    Console.WriteLine("Item Found");
else            
    Console.WriteLine("Item Not Found");    

工作示例here

【讨论】:

  • 非常感谢,但有没有办法将其限制为列表中的第一个术语?如果另一个项目的数量与我正在检查的 PRICE 相同,那将是误报。我的物品有精确的数量。
  • 我没有得到实际要求
【解决方案3】:

您可以使用 linq 来实现这一点而无需循环。 喜欢...

var itemlist = (From tbl in items where tbl[0] == QTY Select tbl).ToList();

【讨论】:

  • 虽然这避免了编写一个循环,但它并没有避免执行一个循环。 LINQ 很漂亮,但它并不神奇。
猜你喜欢
  • 2022-01-09
  • 2013-03-14
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2016-01-20
  • 2022-10-23
相关资源
最近更新 更多