我创建了一个二维列表,并希望返回最大值,最小值以及与这些值具有相同索引的名称。
这就是我所做的。
class Info
{
private string stad;
private double temperatur;
public string Stad
{
get { return stad; }
set { stad = value; }
}
public double Temperatur
{
get { return temperatur; }
set { temperatur = value; }
}
}
static double SearchMax(List<Info> list)
{
if (list.Count == 0)
{
throw new InvalidOperationException("Tomt Lista");
}
double Temperatur = double.MinValue;
foreach (Info temperatur in list)
{
if (temperatur.Temperatur > Temperatur)
{
Temperatur = temperatur.Temperatur;
}
}
return Temperatur;
}
static double SearchMin(List<Info> list)
{
if (list.Count == 0)
{
throw new InvalidOperationException("Tomt Lista");
}
double Tempertatur = double.MaxValue;
foreach (Info temperatur in list)
{
if (temperatur.Temperatur < Tempertatur)
{
Tempertatur = temperatur.Temperatur;
}
}
return Tempertatur;
}
但我得到的回报只是最大值和最小值,而不是温度所在城市的名称。
有人能告诉我或告诉我如何归还两者吗?
感谢您提供的所有帮助,但它只是让我回到我之前的位置,然后再将其发布到此处。我想要的是该计划返回城市和城市的温度 即“最温暖的城市是奥斯陆,温度为20°C” 而不是“最温暖的城市是consoleaplication.info”
编辑:2 感谢您的帮助,特别是Alex ^ _ ^
答案 0 :(得分:2)
非常紧凑但效率低下的LINQ解决方案:
static Info SearchMin(List<Info> list)
{
return data.OrderBy(i => i.Temperatur).First();
}
但您可能想要调整自己的代码:
static Info SearchMin(List<Info> list)
{
if (list.Count == 0)
{
throw new InvalidOperationException("Tomt Lista");
}
double Tempertatur = double.MaxValue;
Info result = null;
foreach (Info temperatur in list)
{
if (temperatur.Temperatur < Tempertatur)
{
Tempertatur = temperatur.Temperatur;
result = temperatur;
}
}
return result;
}
正如您所看到的,主要观点是返回Info
而不是double
。
答案 1 :(得分:2)
您可以使用MoreLinq中的MaxBy和MinBy方法执行此操作。
public static partial class MoreEnumerable
{
public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> selector)
{
return source.MaxBy(selector, Comparer<TKey>.Default);
}
public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> selector, IComparer<TKey> comparer)
{
using (IEnumerator<TSource> sourceIterator = source.GetEnumerator())
{
if (!sourceIterator.MoveNext())
{
throw new InvalidOperationException("Sequence was empty");
}
TSource max = sourceIterator.Current;
TKey maxKey = selector(max);
while (sourceIterator.MoveNext())
{
TSource candidate = sourceIterator.Current;
TKey candidateProjected = selector(candidate);
if (comparer.Compare(candidateProjected, maxKey) > 0)
{
max = candidate;
maxKey = candidateProjected;
}
}
return max;
}
}
public static TSource MinBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> selector)
{
return source.MinBy(selector, Comparer<TKey>.Default);
}
public static TSource MinBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> selector, IComparer<TKey> comparer)
{
using (IEnumerator<TSource> sourceIterator = source.GetEnumerator())
{
if (!sourceIterator.MoveNext())
{
throw new InvalidOperationException("Sequence was empty");
}
TSource min = sourceIterator.Current;
TKey minKey = selector(min);
while (sourceIterator.MoveNext())
{
TSource candidate = sourceIterator.Current;
TKey candidateProjected = selector(candidate);
if (comparer.Compare(candidateProjected, minKey) < 0)
{
min = candidate;
minKey = candidateProjected;
}
}
return min;
}
}
}
(编辑删除注释和对参数进行空检查。)
一旦你拥有它,这是非常微不足道的:
Info maxInfo = list.MaxBy(item => item.Temperatur);
Info minInfo = list.MinBy(item => item.Temperatur);
答案 2 :(得分:0)
当然可以稍微调整一下以缩短它:
var maxtemp = list.Max(x => x.Temperatur);
var maxstad = list.First(x => x.Temperatur == maxtemp).Stad;
var mintemp = list.Min(x => x.Temperatur);
var minstad = list.First(x => x.Temperatur == mintemp).Stad;
答案 3 :(得分:0)
您可以按Temperatur
订购,然后选择第一个。
这可能在BIG列表上很慢
static Info SearchMax(List<Info> list)
{
if (list.Count == 0)
{
throw new InvalidOperationException("Tomt Lista");
}
return list.OrderByDescending(i => i.Temperatur).FirstOrDefault();
}
static Info SearchMin(List<Info> list)
{
if (list.Count == 0)
{
throw new InvalidOperationException("Tomt Lista");
}
return list.OrderBy(i => i.Temperatur).FirstOrDefault();;
}
答案 4 :(得分:0)
private static TempratureInfo FindHighestTemprature(IList<TempratureInfo> tempratures)
{
if(tempratures.Count == 0)
throw new InvalidOperationException("tempratures");
return tempratures.OrderByDescending(t => t.Temprature)
.First();
}
private static TempratureInfo FindLowestTemprature(IList<TempratureInfo> tempratures)
{
if (tempratures.Count == 0)
throw new InvalidOperationException("tempratures");
return tempratures.OrderBy(t => t.Temprature)
.First();
}
您可以修改您的Info
类以覆盖ToString
,当您在预期字符串,参数传递,变量赋值等时调用上述任一函数时,它将返回格式化字符串。
internal class TempratureInfo
{
public string Name { get; set; }
public double Temprature { get; set; }
public override string ToString()
{
return string.Format("Temprature in {0} is currently {1}", Name, Temprature);
}
}
示例实施:
private static void Main(string[] args)
{
List<TempratureInfo> unitedKingdomTempratures = new List<TempratureInfo>()
{
{new TempratureInfo() { Name = "Wales", Temprature = 10.0}},
{new TempratureInfo() { Name = "England", Temprature = 55.0}},
{new TempratureInfo() { Name = "Scotland", Temprature = 22.0}},
{new TempratureInfo() { Name = "Northen Ireland", Temprature = 4.0}}
};
Console.WriteLine("Hottest: " + FindHighestTemprature(unitedKingdomTempratures).Name);
Console.WriteLine("Coldest: " + FindLowestTemprature(unitedKingdomTempratures).Name);
Console.ReadLine();
}