C# 为什么可枚举Concat在这里重复?
按照下面的代码,在对枚举进行排序之前,我试图在枚举中获取一个值。该值显示两次 为什么??最好的办法是什么 干杯,C# 为什么可枚举Concat在这里重复?,c#,.net,linq,C#,.net,Linq,按照下面的代码,在对枚举进行排序之前,我试图在枚举中获取一个值。该值显示两次 为什么??最好的办法是什么 干杯, 贝里尔 编辑 Currency.getCurrences()正在调用线程安全缓存的实现,该实现包装字典并返回其值: public ICollection<TValue> Values { get { return _inner.Values; } } public ICollection值{get{return\u inner.Values;} 我没有这种类型的。将代
贝里尔 编辑 Currency.getCurrences()正在调用线程安全缓存的实现,该实现包装字典并返回其值:
public ICollection<TValue> Values { get { return _inner.Values; } }
public ICollection值{get{return\u inner.Values;}
我没有这种类型的。将代码更改为“slap”a ToArray()可以修复此问题,使concat值只显示一次,是一个可接受的解决方案。不确定为什么它会在不强制枚举的情况下显示两次,尽管线程似乎位于根..就像@CodeInChaos所说的,这可能是因为GetCachedCurrences不包含该元素 我编写了一个小程序,只得到了一个“KWD”实例
enum CurrencyIsoCode
{
USD,
KWD,
JPY,
XCD,
TVD
}
class Currency
{
public Currency() : this(false) { }
public Currency(bool inner) { }
public static IEnumerable<Currency> GetCachedCurrencies()
{
return new[] {
new Currency () { currencyCode = CurrencyIsoCode.USD },
new Currency () { currencyCode = CurrencyIsoCode.JPY },
new Currency () { currencyCode = CurrencyIsoCode.XCD }
};
}
public CurrencyIsoCode currencyCode { set; get; }
public string AlphabeticCode
{
get { return currencyCode.ToString(); }
}
public static Currency Get(CurrencyIsoCode isOCode)
{
return new Currency() { currencyCode = isOCode };
}
}
class Program
{
private static IEnumerable<Currency> _commonCurrencies = null;
static void Main(string[] args)
{
var currencies = GetCommonCurrencies();
foreach (var curr in currencies)
Console.WriteLine(curr.AlphabeticCode);
Console.Read();
}
public static IEnumerable<Currency> GetCommonCurrencies()
{
return _commonCurrencies ??
( _commonCurrencies
= Currency.GetCachedCurrencies()
.Concat(new[] {Currency.Get(CurrencyIsoCode.KWD)})
.Where(x => !x.AlphabeticCode.StartsWith("X", StringComparison.InvariantCultureIgnoreCase))
.OrderBy(x => x.AlphabeticCode));
}
}
enum CurrencyIsoCode
{
美元,
科威特第纳尔,
日元,
XCD,
电视
}
类别货币
{
公共货币():此(假){}
公共货币(布尔内部){}
公共静态IEnumerable GetCachedCurrences()
{
返回新的[]{
新货币(){currencyCode=CurrencyIsoCode.USD},
新货币(){currencyCode=CurrencyIsoCode.JPY},
新货币(){currencyCode=CurrencyIsoCode.XCD}
};
}
公共货币等码货币代码{set;get;}
公共字符串字母代码
{
获取{return currencyCode.ToString();}
}
公共静态货币获取(CurrencyIsoCode isOCode)
{
返回新货币(){currencyCode=isOCode};
}
}
班级计划
{
私有静态IEnumerable\u commonCurrencies=null;
静态void Main(字符串[]参数)
{
var currences=getCommonCurrences();
foreach(以货币表示的var curr)
控制台写入线(当前字母代码);
Console.Read();
}
公共静态IEnumerable GetCommonCurrencies()
{
返回普通货币??
()
=货币。GetCachedCurrencies()
.Concat(新[]{Currency.Get(CurrencyIsoCode.KWD)})
.Where(x=>!x.alphalogycode.StartsWith(“x”,StringComparison.InvariantCultureIgnoreCase))
.OrderBy(x=>x.alphalcoccode));
}
}
正如@CodeInChaos所说,这可能是因为getCachedCurrency不包含该元素
我编写了一个小程序,只得到了一个“KWD”实例
enum CurrencyIsoCode
{
USD,
KWD,
JPY,
XCD,
TVD
}
class Currency
{
public Currency() : this(false) { }
public Currency(bool inner) { }
public static IEnumerable<Currency> GetCachedCurrencies()
{
return new[] {
new Currency () { currencyCode = CurrencyIsoCode.USD },
new Currency () { currencyCode = CurrencyIsoCode.JPY },
new Currency () { currencyCode = CurrencyIsoCode.XCD }
};
}
public CurrencyIsoCode currencyCode { set; get; }
public string AlphabeticCode
{
get { return currencyCode.ToString(); }
}
public static Currency Get(CurrencyIsoCode isOCode)
{
return new Currency() { currencyCode = isOCode };
}
}
class Program
{
private static IEnumerable<Currency> _commonCurrencies = null;
static void Main(string[] args)
{
var currencies = GetCommonCurrencies();
foreach (var curr in currencies)
Console.WriteLine(curr.AlphabeticCode);
Console.Read();
}
public static IEnumerable<Currency> GetCommonCurrencies()
{
return _commonCurrencies ??
( _commonCurrencies
= Currency.GetCachedCurrencies()
.Concat(new[] {Currency.Get(CurrencyIsoCode.KWD)})
.Where(x => !x.AlphabeticCode.StartsWith("X", StringComparison.InvariantCultureIgnoreCase))
.OrderBy(x => x.AlphabeticCode));
}
}
enum CurrencyIsoCode
{
美元,
科威特第纳尔,
日元,
XCD,
电视
}
类别货币
{
公共货币():此(假){}
公共货币(布尔内部){}
公共静态IEnumerable GetCachedCurrences()
{
返回新的[]{
新货币(){currencyCode=CurrencyIsoCode.USD},
新货币(){currencyCode=CurrencyIsoCode.JPY},
新货币(){currencyCode=CurrencyIsoCode.XCD}
};
}
公共货币等码货币代码{set;get;}
公共字符串字母代码
{
获取{return currencyCode.ToString();}
}
公共静态货币获取(CurrencyIsoCode isOCode)
{
返回新货币(){currencyCode=isOCode};
}
}
班级计划
{
私有静态IEnumerable\u commonCurrencies=null;
静态void Main(字符串[]参数)
{
var currences=getCommonCurrences();
foreach(以货币表示的var curr)
控制台写入线(当前字母代码);
Console.Read();
}
公共静态IEnumerable GetCommonCurrencies()
{
返回普通货币??
(通用货币
=货币。GetCachedCurrencies()
.Concat(新[]{Currency.Get(CurrencyIsoCode.KWD)})
.Where(x=>!x.alphalogycode.StartsWith(“x”,StringComparison.InvariantCultureIgnoreCase))
.OrderBy(x=>x.alphalcoccode));
}
}
货币是否实现了等于
?然后您可以执行Distinct()
调用。@Berryl可能货币。GetCachedCurrences()
已经包含一个Concat
用于组合序列,Union
用于组合集合。然后给出重现问题的代码。延迟评估可能会导致您的意外行为。也许您需要执行ToArray()
/ToList()
调用。是否有可能从多个磁带调用GetCommonCurrencies
?这样一来,由于\u commonCurrencies
是静态的,KWD可以多次添加到结果中。除此之外,我支持您向我们提供可以重现问题的代码的想法。Currency
是否实现Equals
?然后您可以执行Distinct()
调用。@Berryl可能Currency.GetCachedCurrencies()
已经包含一个Concat
用于组合序列,Union
用于组合集合。然后给出重现问题的代码。延迟评估可能会导致您的意外行为。也许您需要执行ToArray()
/ToList()
调用。是否有可能从多个磁带调用GetCommonCurrencies
?这样一来,由于\u commonCurrencies
是静态的,KWD可以多次添加到结果中。除此之外,我支持您为我们提供代码来重现问题的想法。Nikola对多线程调用的分析在这一点上似乎是最有可能的。见编辑后的文章。Cheesnikola对多线程调用的分析在这一点上似乎是最有可能的。见编辑后的文章。干杯
enum CurrencyIsoCode
{
USD,
KWD,
JPY,
XCD,
TVD
}
class Currency
{
public Currency() : this(false) { }
public Currency(bool inner) { }
public static IEnumerable<Currency> GetCachedCurrencies()
{
return new[] {
new Currency () { currencyCode = CurrencyIsoCode.USD },
new Currency () { currencyCode = CurrencyIsoCode.JPY },
new Currency () { currencyCode = CurrencyIsoCode.XCD }
};
}
public CurrencyIsoCode currencyCode { set; get; }
public string AlphabeticCode
{
get { return currencyCode.ToString(); }
}
public static Currency Get(CurrencyIsoCode isOCode)
{
return new Currency() { currencyCode = isOCode };
}
}
class Program
{
private static IEnumerable<Currency> _commonCurrencies = null;
static void Main(string[] args)
{
var currencies = GetCommonCurrencies();
foreach (var curr in currencies)
Console.WriteLine(curr.AlphabeticCode);
Console.Read();
}
public static IEnumerable<Currency> GetCommonCurrencies()
{
return _commonCurrencies ??
( _commonCurrencies
= Currency.GetCachedCurrencies()
.Concat(new[] {Currency.Get(CurrencyIsoCode.KWD)})
.Where(x => !x.AlphabeticCode.StartsWith("X", StringComparison.InvariantCultureIgnoreCase))
.OrderBy(x => x.AlphabeticCode));
}
}