【问题标题】:Compare multiple element in a list比较列表中的多个元素
【发布时间】:2020-11-14 17:26:35
【问题描述】:

我想从列表中提取符合不同标准的元素的数据,如下所示:

我的清单包含:

1, name1, Time, quantity
2, name2, Time, quantity
3, name1, Time+1, quantity+1
4, name2, Time+1, quantity+1
....

我的目标:

if (MyList.Contains(name1 && name2))
{
    if (name1(quantity) == name2(quantity) && name1(Time) == name2(Time))
    {
        return quantity;
    }
}

我如何创建我的列表:

public class OCO1 : IEquatable<OCO1>
{
        public DateTime OrderCreatedTime {get; set;}
        public int ID {get; set;}
        public decimal Quantity {get; set;}
        public string Tag {get; set;}

        public override string ToString()
        {
            return "ID: " + ID + "   Name: " + Tag;
        }
        public override bool Equals(object obj)
        {
            if (obj == null) return false;
            OCO1 objAsOCO1 = obj as OCO1;
            if (objAsOCO1 == null) return false;
            else return Equals(objAsOCO1);
        }
        public override int GetHashCode()
        {
            return ID;
        }
        public bool Equals(OCO1 other)
        {
            if (other == null) return false;
            return (this.ID.Equals(other.ID));
        }
    // Should also override == and != operators.
}

public partial class Base
{
List<OCO1> CreatedTimeOrder = new List<OCO1>();

if (order.Tag.Equals("name1"))
{
CreatedTimeOrder.Add( new OCO1() {OrderCreatedTime = order.CreatedTime, ID = order.Id, Quantity = order.Quantity, Tag = "name1"});
}

if (order.Tag.Equals("name2"))
{
CreatedTimeOrder.Add( new OCO1() {OrderCreatedTime = order.CreatedTime, ID = order.Id, Quantity = order.Quantity, Tag = "name2"});
}

我不知道该怎么做。任何帮助不胜感激!

“编辑帖子的更多详细信息 jskfjhsfsjfsgfghsfshsfghjsfgsdsjffsgfgsgfyjhdfusygfyusgfuygsdvfvsdufvusvfuvsufvyusdfgyugfdyugfusgfuysfgusfgusgfuysgfgsugfusgfugfgsfgufgusfugydsfg

【问题讨论】:

  • 这并不重要,因为这两种类型都是可枚举的,但这真的是 List 吗?看起来它会是一个 DataTable。
  • 是的,它似乎不是一个列表,但它是:)
  • 在您的示例中,有多个条目满足您的条件。你想拥有第一个还是全部? 1、2 和 3,4 确实有名称:name1、name2 并且具有相同的时间和数量。
  • 有什么方法可以将类型转换为 DataTable?如果这样做,使用 DataTable 很容易实现所需的输出。
  • 如果name1和name2的时间相同,我想获取数量。我不明白如何解释它..

标签: c# list extract


【解决方案1】:

如果我理解这个问题,您希望找到所有具有相同 QuantityTime 值并且同时包含 "name1""name2" 的记录,并且对于每一个您想要选择Quantity 属性。

如果这是正确的,我们可以使用一点 System.Linq 按它们的 OrderCreatedTimeQuantity 属性对项目进行分组,过滤到仅具有每个所需名称的至少一个项目的组,然后选择来自组的Quantity 属性:

List<decimal> relevantQuantities = CreatedTimeOrder
    .GroupBy(item => new {item.OrderCreatedTime, item.Quantity})
    .Where(group => group.Any(item => item.Tag == "name1") &&
                    group.Any(item => item.Tag == "name2"))
    .Select(g => g.Key.Quantity)
    .ToList();

如果这正确,请准确说明您期望返回的内容。

【讨论】:

  • 看来确实是这样,没想到groupby能做到。我明天在我的代码中实现它并告诉你结果。非常感谢!
  • 你好 Rufus,虽然 "relevantQuantities" 是十进制的,但返回值是 int.. 我必须得到十进制的。
  • 我有更改 .Tolist();在 .FirstOrDefault() 的 linq 查询结束时;返回是十进制的。如果可以的话,我会编辑你的帖子。
  • relevantQuantitiesList&lt;decimal&gt;,因为它返回所有符合条件的数量。
【解决方案2】:

根据作者的评论:

如果 name1 和 name2 的时间相同,我想获取数量。我不明白如何解释它。

想象一下这个类,为了这个答案的简单而缩写。

public class Data
{
  public string Name { get; set; }
  public int Time { get; set; }
}

还有这个系列

List<Data> list = new List<Data>() { 
  new Data() { Name = "Name1", Time = 1 },
  new Data() { Name = "Name2", Time = 2 },
  new Data() { Name = "Name3", Time = 3 },
  new Data() { Name = "Name4", Time = 4 },
 };

你可以用 LINQ 做到这一点

string searchArray = new string[] { "Name1", "Name2" };
// Filtering only elements with Name equals name1 or name2
var filtered = list.Where(d => searchArray.Contains(d.Name)); 
if(filtered.GroupBy(d => d.Time).Count() == 1) // If there is only one group of Time
 return filtered.Sum(d => d.Time); // it will return 3 (1 + 2)
else
  // do another thing

【讨论】:

  • 您应该将new string[] { "Name1", "Name2" } 移出Where 子句。
  • 仅供参考,无需在群组上调用ToArray(),因为GroupBy 返回IEnumerable
  • 对不起,我赶时间,错过了这些改进。答案已编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 2019-12-07
  • 2020-07-04
  • 1970-01-01
相关资源
最近更新 更多