Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 为什么可枚举Concat在这里重复?_C#_.net_Linq - Fatal编程技术网

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));
    }       
}