求个算法,高手进来看看

linsx1987 2011-03-09 11:03:12
通过其它公司提供的接口,返回数组,数据如下
name price
名称1 150
名称1 160
名称1 0
名称1 200
名称1 300
名称2 150
名称2 0
名称2 150
名称2 300
名称2 250
名称2 100
想得出的结果是:
name price(最小值)
名称1 150
名称2 100
price的最小值必须是大于0的。当然如果price都是0的话,就返回0。

请大家帮帮忙!
...全文
182 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
W511522329 2011-03-09
  • 打赏
  • 举报
回复
class priceobj
{
public string name { get; set; }
public int price { get; set; }
}

List<priceobj> prices = new List<priceobj>();
for (int a = 0; a < arr2.Length/arr2.Rank; a++)
{

bool isfind = false;
foreach (var item in prices)
{
if (item.name == arr2[a, 0])
{
isfind = true;
if (item.price > int.Parse(arr2[a, 1]) && int.Parse(arr2[a, 1]) != 0)
{
item.price = int.Parse(arr2[a, 1]);
}
}

}
if (!isfind)
prices.Add(new priceobj { name = arr2[a, 0], price = int.Parse(arr2[a, 1]) });
}

foreach (var item in prices)
{
Console.WriteLine(item.name+"|"+item.price.ToString());
}
Console.Read();
W511522329 2011-03-09
  • 打赏
  • 举报
回复
class priceobj
{
public string name { get; set; }
public int price { get; set; }
}

List<priceobj> prices = new List<priceobj>();
for (int a = 0; a < arr2.Length/arr2.Rank; a++)
{

bool isfind = false;
foreach (var item in prices)
{
if (item.name == arr2[a, 0])
{
isfind = true;
if (item.price > int.Parse(arr2[a, 1]) && int.Parse(arr2[a, 1]) != 0)
{
item.price = int.Parse(arr2[a, 1]);
}
}

}
if (!isfind)
prices.Add(new priceobj { name = arr2[a, 0], price = int.Parse(arr2[a, 1]) });
}

foreach (var item in prices)
{
Console.WriteLine(item.name+"|"+item.price.ToString());
}
Console.Read();
shiyuyao1987 2011-03-09
  • 打赏
  • 举报
回复

class Program
{
static void Main(string[] args)
{
Dictionary<string, decimal> dic = GetResult();
foreach (KeyValuePair<string, decimal> kvp in dic)
{
Console.WriteLine("name:" + kvp.Key + " price:" + kvp.Value);
}
}

public static Dictionary<string, decimal> GetResult()
{
string[] strNames = new string[] { "名称1", "名称2", "名称3" };
IList<a> list = new List<a>(){
new a("名称1",150),
new a("名称1",160),
new a("名称1",0),
new a("名称1",200),
new a("名称1",300),
new a("名称1",150),
new a("名称1",-50),
new a("名称2",150),
new a("名称2",0),
new a("名称2",300),
new a("名称2",250),
new a("名称2",-100),
new a("名称2",100)};
Dictionary<string, decimal> dic = list.Where(p => p.price > 0).
GroupBy(p => p.name).
Select(p => p.OrderBy(q => q.price).First()).ToDictionary(p => p.name, q => q.price);
foreach (string s in strNames)
{
if (!dic.ContainsKey(s))
{
dic.Add(s, 0);
}
}
return dic;
}
}

public class a
{
public string name { get; set; }
public decimal price { get; set; }
public a(string name, decimal price)
{
this.name = name;
this.price = price;
}
}
  • 打赏
  • 举报
回复
遍历判断一下 等于 0的 就删除掉
linsx1987 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wxr0323 的回复:]

C# code
//名称1 150
//名称1 160
//名称1 0
//名称1 200
//名称1 300
//名称2 150
//名称2 0
//名称2 150
//名称2 300
//名称2 250
//名称2 100
//声明名称1 和2的数组
List<int> list1 = new Li……
[/Quote]
不止是名称1,名称2,还有可能名称3,名称4的
子夜__ 2011-03-09
  • 打赏
  • 举报
回复
  //名称1 150
//名称1 160
//名称1 0
//名称1 200
//名称1 300
//名称2 150
//名称2 0
//名称2 150
//名称2 300
//名称2 250
//名称2 100
//声明名称1 和2的数组
List<int> list1 = new List<int>();
List<int> list2 = new List<int>();
//添加名称1的 price
list1.Add(150);
list1.Add(160);
list1.Add(200);
list1.Add(150);
//list1.Min().ToString() 取最小值
Response.Write(list1.Min().ToString());
//名称2的同理
linsx1987 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 strife 的回复:]

这个不需要太复杂的算法吧,把返回结果放在一个list里面写一个简单的函数就行了
[/Quote]

是什么函数呢?
linsx1987 2011-03-09
  • 打赏
  • 举报
回复
挺急的,头脑现在不是很清晰,大家帮帮忙~
strife013 2011-03-09
  • 打赏
  • 举报
回复
这个不需要太复杂的算法吧,把返回结果放在一个list里面写一个简单的函数就行了
  • 打赏
  • 举报
回复
鄙人一点愚见 忘高手们见谅。 我的看法是把得来数组的值 放到数据库一张表中 用sql语句。select min(price) price,name from table where price > 0 group by(name) 我认为此效率最高。不过单纯在程序里面写算法也是最直接的方法,上面有高手已经解答过了。
ghosty_hand 2011-03-09
  • 打赏
  • 举报
回复
这个问题啊 想都不想就来问的。。
huangwenquan123 2011-03-09
  • 打赏
  • 举报
回复
        List<Money> list = new List<Money>() { new Money("名称1", 150),new Money("名称1", 160),new Money("名称1", 0),new Money("名称1", 200),
new Money("名称2", 0),new Money("名称2", 100) , new Money("名称2", 80)};

var result = from c in list where c.Price > 0 group c by c.Name into g select new { g.Key, price = g.Min(c => c.Price) };
foreach (var money in result)
{
Response.Write(money.Key + "=" + money.price + "<br/>");
}
凤凰涅檠 2011-03-09
  • 打赏
  • 举报
回复
int[] arr1 = {150,160,0,200,..};
int min = 0;
for (int i = 0; i < arr1.length; i++)
{
if (min > arr1[i])
{
min = arr1[i];
}
}
return min;

同理arr2
claymore1114 2011-03-09
  • 打赏
  • 举报
回复
用linq 还是比较简单的。 先分组 再排序 再取第一个。 可以参考7楼的。

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧