Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c linq“潜在”分组和差异_C#_Linq - Fatal编程技术网

C# c linq“潜在”分组和差异

C# c linq“潜在”分组和差异,c#,linq,C#,Linq,我不知道如何解决这个问题。下面我有一个类,用来表示从两个网站提取的数据。我想比较“Site1交易价格与Site2价格”和“Site2交易价格与Site1价格”之间的差异 public class Card { public string Name {get;set;} public string Site {get;set;} public decimal TradePrice {get;set;} public decimal Price {get;set;} } 下面是一个

我不知道如何解决这个问题。下面我有一个类,用来表示从两个网站提取的数据。我想比较“Site1交易价格与Site2价格”和“Site2交易价格与Site1价格”之间的差异

public class Card
{
  public string Name {get;set;}
  public string Site {get;set;}
  public decimal TradePrice {get;set;}
  public decimal Price {get;set;}
}
下面是一个示例列表,其中包含来自两个不同“站点”的相同“卡”

List<Card> cards = new List<Card)
{
  new Card() { Name="card1", Site="site1", TradePrice=8, Price=12 },
  new Card() { Name="card1", Site="site2", TradePrice=5, Price=10 },
  new Card() { Name="card2", Site="site1", TradePrice=13, Price=16 },
  new Card() { Name="card2", Site="site2", TradePrice=4, Price=5 },
  new Card() { Name="card3", Site="site1", TradePrice=2, Price=4 },
  new Card() { Name="card3", Site="site2", TradePrice=3, Price=6 }
}

这对linq有可能吗?我倾向于分组,但不确定如何准确地做到这一点。建议?

我要接受这个建议

您可以按卡片名称分组,这将为您提供一组两张卡片的集合。例如,从那里您可以选择进入DiffCard。像这样:

// Usage
var answer = cards
    .GroupBy(c => c.Name)
    .SelectMany(ToDiffs)
    .ToList(); // A list of DiffCards

// or maybe?
var answer =
    from card in cards
    group card by card.Name into siteGroup
    let o = siteGroup.ElementAt(0)
    let t = siteGroup.ElementAt(1)
    select new List<DiffCard> { new DiffCard(o, t), new DiffCard(t, o) } into diffs
    from diff in diffs
    select diff;

public class DiffCard
{
    public string Name { get; set; }
    public decimal TradePrice { get; set; }
    public decimal Price { get; set; }
    public decimal Diff => Math.Abs(TradePrice - Price);

    public DiffCard(Card one, Card two)
    {
        Name = one.Name;
        TradePrice = one.TradePrice;
        Price = two.Price;
    }
}


IEnumerable<DiffCard> ToDiffs(IGrouping<string, Card> group)
{
    var one = group.ElementAt(0);
    var two = group.ElementAt(1);
    var diffs = new List<DiffCard>
    {
        new DiffCard(one, two),
        new DiffCard(two, one)
    };
    foreach (var diff in diffs)
    {
        yield return diff;
    }
}

这不只是Diff=价格-交易价格的预测吗?这里的分组在哪里?在card1.name等于card2.name上使用联接是的,确实如此,但我过度简化了包含数据的原始列表。本质上,列表将有一个站点对,现在我需要找到匹配之间的差异pair@Aaron.S您能否提供改进的示例输入和输出数据?如何从card1或card2中选择哪种TradePrice?
// Usage
var answer = cards
    .GroupBy(c => c.Name)
    .SelectMany(ToDiffs)
    .ToList(); // A list of DiffCards

// or maybe?
var answer =
    from card in cards
    group card by card.Name into siteGroup
    let o = siteGroup.ElementAt(0)
    let t = siteGroup.ElementAt(1)
    select new List<DiffCard> { new DiffCard(o, t), new DiffCard(t, o) } into diffs
    from diff in diffs
    select diff;

public class DiffCard
{
    public string Name { get; set; }
    public decimal TradePrice { get; set; }
    public decimal Price { get; set; }
    public decimal Diff => Math.Abs(TradePrice - Price);

    public DiffCard(Card one, Card two)
    {
        Name = one.Name;
        TradePrice = one.TradePrice;
        Price = two.Price;
    }
}


IEnumerable<DiffCard> ToDiffs(IGrouping<string, Card> group)
{
    var one = group.ElementAt(0);
    var two = group.ElementAt(1);
    var diffs = new List<DiffCard>
    {
        new DiffCard(one, two),
        new DiffCard(two, one)
    };
    foreach (var diff in diffs)
    {
        yield return diff;
    }
}