C# c linq“潜在”分组和差异
我不知道如何解决这个问题。下面我有一个类,用来表示从两个网站提取的数据。我想比较“Site1交易价格与Site2价格”和“Site2交易价格与Site1价格”之间的差异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;} } 下面是一个
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;
}
}