Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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#中循环trought对象列表?_C#_Loops - Fatal编程技术网

以更好的方式在C#中循环trought对象列表?

以更好的方式在C#中循环trought对象列表?,c#,loops,C#,Loops,我有一个foreach循环,它循环一系列对象。它的意思是将NavigateUrl设置为超链接。我的代码如下所示: foreach (var con in contacts) { if (con.ContactTypeID == 1) { FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL; }

我有一个foreach循环,它循环一系列对象。它的意思是将NavigateUrl设置为超链接。我的代码如下所示:

foreach (var con in contacts)
        {
            if (con.ContactTypeID == 1)
            {
                FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
            }
        }
我想知道他们是否有更好的方法。我将有大约10个其他ContactTypeID,我不想再写9个了。

您可以使用LINQ:

var facebookURL = contacts.Where(c => c.ContactTypeID == 1)
              .Select(c => c.url)
              .FirstOrDefault();
if(facebookURL != null)
    FacebookIcon.NavigateUrl = "http://facebook.com/" + facebookURL;
编辑:实际上,您可以利用LINQ的延迟执行功能,对每种类型的联系人类型重复使用相同的功能:

var contactType = 1; // facebook
var url = contacts.Where(c => c.ContactTypeID == contactType)
      .Select(c => c.url);
if (url.Any())
    FacebookIcon.NavigateUrl = "http://facebook.com/" + url.First();
contactType = 2;    // google
if (url.Any())
    GoogleIcon.NavigateUrl = "http://Google.com/" + url.First();
编辑2:这里有另一种方法,使用字典将所有类型与其URL进行映射,如果您有数百万个类型,这种方法应该更有效;-)(@MAfifi):

您可以使用LINQ:

var facebookURL = contacts.Where(c => c.ContactTypeID == 1)
              .Select(c => c.url)
              .FirstOrDefault();
if(facebookURL != null)
    FacebookIcon.NavigateUrl = "http://facebook.com/" + facebookURL;
编辑:实际上,您可以利用LINQ的延迟执行功能,对每种类型的联系人类型重复使用相同的功能:

var contactType = 1; // facebook
var url = contacts.Where(c => c.ContactTypeID == contactType)
      .Select(c => c.url);
if (url.Any())
    FacebookIcon.NavigateUrl = "http://facebook.com/" + url.First();
contactType = 2;    // google
if (url.Any())
    GoogleIcon.NavigateUrl = "http://Google.com/" + url.First();
编辑2:这里有另一种方法,使用字典将所有类型与其URL进行映射,如果您有数百万个类型,这种方法应该更有效;-)(@MAfifi):


你可以使用LINQ来做你想做的事情

var x = contacts.FirstOrDefault (c => c.ContactTypeID == 1);

if( x != null )
{
   FacebookIcon.NavigateUrl = String.Format ("http://facebook.com/{0}", x.ContactURL);
}

你可以使用LINQ来做你想做的事情

var x = contacts.FirstOrDefault (c => c.ContactTypeID == 1);

if( x != null )
{
   FacebookIcon.NavigateUrl = String.Format ("http://facebook.com/{0}", x.ContactURL);
}
你可以使用开关

switch (caseSwitch)
{
case 1: 
    FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
    break;
case 2:
    //
    break;
default:
    //
    break;
}

您可以使用开关

switch (caseSwitch)
{
case 1: 
    FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
    break;
case 2:
    //
    break;
default:
    //
    break;
}您可以使用linq

var con = contacts.FirsOrDefault(c => c.ContactTypeID.Equals(1));
if (con == null)
{
  return;
}

con.NavigateUrl = "http://facebook.com/" + con.ContactURL;
或者如果你有更多的身份证

List<int> ids = new List<int> {1,2,5,7};
contacts.Where(c => ids.Containt(c.ContactTypeID)).ToList().ForEach(item => item.NavigateUrl = "http://facebook.com/" + item.ContactURL);
List id=新列表{1,2,5,7};
contacts.Where(c=>ids.Containt(c.ContactTypeID)).ToList().ForEach(item=>item.NavigateUrl=”http://facebook.com/“+item.ContactURL);
您可以使用linq

var con = contacts.FirsOrDefault(c => c.ContactTypeID.Equals(1));
if (con == null)
{
  return;
}

con.NavigateUrl = "http://facebook.com/" + con.ContactURL;
或者如果你有更多的身份证

List<int> ids = new List<int> {1,2,5,7};
contacts.Where(c => ids.Containt(c.ContactTypeID)).ToList().ForEach(item => item.NavigateUrl = "http://facebook.com/" + item.ContactURL);
List id=新列表{1,2,5,7};
contacts.Where(c=>ids.Containt(c.ContactTypeID)).ToList().ForEach(item=>item.NavigateUrl=”http://facebook.com/“+item.ContactURL);

如果使用Linq,则应使用First或FirstOrDefault

var url = contacts.FirstOrDefault(c => c.ContactTypeID == 1).NavigateUrl;

如果使用Linq,则应使用First或FirstOrDefault

var url = contacts.FirstOrDefault(c => c.ContactTypeID == 1).NavigateUrl;
使用开关:

foreach (var con in contacts) 
    { 
        switch (con.ContactTypeID) 
        {
          case 1: 
            FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL; 
            break;
          case 2:
            . . . 
            break;
          . . . 
        } 
    } 
使用开关:

foreach (var con in contacts) 
    { 
        switch (con.ContactTypeID) 
        {
          case 1: 
            FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL; 
            break;
          case 2:
            . . . 
            break;
          . . . 
        } 
    } 

可能是一个浓缩的LINQ:

contacts.ForEach(c => { if (c.ContactTypeID  == 1) FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;  });

如果要为每个ContactTypeID==1执行“it”操作。

可能需要一个压缩LINQ:

contacts.ForEach(c => { if (c.ContactTypeID  == 1) FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;  });

如果您想为每个ContactTypeID==1“it”,我假设每个联系人不一定是Facebook,您需要根据联系人的内容动态设置不同的属性

你最好的选择是一本
字典
或类似的东西,在那里你只需要做一些事情

var setCorrectUrl = new Dictionary<int, Action<Contact>>
{
    // Appropriate entries in here, e.g. (syntax not quite right)
    {
        1,
        (contact) => FacebookIcon.NavigateUrl = contact.ContactURL;
    }
}

foreach (var con in contacts)
{
    setCorrectUrl[con.ContactTypeID](con);
}
var setCorrectUrl=新字典
{
//此处有适当的条目,例如(语法不太正确)
{
1.
(contact)=>FacebookIcon.NavigateUrl=contact.ContactURL;
}
}
foreach(触点中的var con)
{
setCorrectUrl[con.ContactTypeID](con);
}

我假设每个联系人不一定是Facebook,您需要根据联系人的身份动态设置不同的属性

你最好的选择是一本
字典
或类似的东西,在那里你只需要做一些事情

var setCorrectUrl = new Dictionary<int, Action<Contact>>
{
    // Appropriate entries in here, e.g. (syntax not quite right)
    {
        1,
        (contact) => FacebookIcon.NavigateUrl = contact.ContactURL;
    }
}

foreach (var con in contacts)
{
    setCorrectUrl[con.ContactTypeID](con);
}
var setCorrectUrl=新字典
{
//此处有适当的条目,例如(语法不太正确)
{
1.
(contact)=>FacebookIcon.NavigateUrl=contact.ContactURL;
}
}
foreach(触点中的var con)
{
setCorrectUrl[con.ContactTypeID](con);
}

好吧,我会对代码进行一些重构。 想象一下,他还有10种其他类型需要实现:) 上面提供的解决方案是可行的,但在可扩展性方面不是很好

因此,以下是我的解决方案:

1) 实现具有公共联系人属性的基类

public abstract class BaseContact
{
    public string Name { get; set; }
    public abstract string Url { get; set; }

}
2) 实现具体类型

public class FbContact : BaseContact
{
    private string _baseUrl = "http://facebook.com/{0}";
    private string _url = string.Empty;

    public override string Url
    {
        get { return _url; }
        set { _url = string.Format(_baseUrl, value); }
    }
}

public class LinkedInContact : BaseContact
{
    private string _baseUrl = "http://linkedin.com/{0}";
    private string _url = string.Empty;

    public override string Url
    {
        get { return _url; }
        set { _url = string.Format(_baseUrl, value); }
    }
}
3) 这只是一个用于设置导航url的帮助器类

public static class NavigationCreator
{
    public static void SetUrl(BaseContact contact, HyperLink link)
    {
        link.NavigateUrl = contact.Url;
    }
}
4) 一些用于可视化结果的测试代码

        List<BaseContact> items = new List<BaseContact>();

        for (int i = 0; i < 5; i++)
        {
            BaseContact item;
            if (i % 2 == 0) item = new FbContact(); else item = new LinkedInContact();

            item.Url = "My name " + i;

            items.Add(item);
        }

        foreach (var contact in items)
        {
            HyperLink link = new HyperLink();
            NavigationCreator.SetUrl(contact, link);
            Console.WriteLine(link.NavigateUrl);
        }

        Console.Read();
List items=newlist();
对于(int i=0;i<5;i++)
{
基本接触项目;
如果(i%2==0)项=新FbContact();否则项=新LinkedInContact();
item.Url=“我的名字”+i;
项目。添加(项目);
}
foreach(项目中的var联系人)
{
超级链接=新的超级链接();
NavigationCreator.SetUrl(联系人,链接);
Console.WriteLine(link.NavigateUrl);
}
Console.Read();

好吧,我会对代码进行一些重构。 想象一下,他还有10种其他类型需要实现:) 上面提供的解决方案是可行的,但在可扩展性方面不是很好

因此,以下是我的解决方案:

1) 实现具有公共联系人属性的基类

public abstract class BaseContact
{
    public string Name { get; set; }
    public abstract string Url { get; set; }

}
2) 实现具体类型

public class FbContact : BaseContact
{
    private string _baseUrl = "http://facebook.com/{0}";
    private string _url = string.Empty;

    public override string Url
    {
        get { return _url; }
        set { _url = string.Format(_baseUrl, value); }
    }
}

public class LinkedInContact : BaseContact
{
    private string _baseUrl = "http://linkedin.com/{0}";
    private string _url = string.Empty;

    public override string Url
    {
        get { return _url; }
        set { _url = string.Format(_baseUrl, value); }
    }
}
3) 这只是一个用于设置导航url的帮助器类

public static class NavigationCreator
{
    public static void SetUrl(BaseContact contact, HyperLink link)
    {
        link.NavigateUrl = contact.Url;
    }
}
4) 一些用于可视化结果的测试代码

        List<BaseContact> items = new List<BaseContact>();

        for (int i = 0; i < 5; i++)
        {
            BaseContact item;
            if (i % 2 == 0) item = new FbContact(); else item = new LinkedInContact();

            item.Url = "My name " + i;

            items.Add(item);
        }

        foreach (var contact in items)
        {
            HyperLink link = new HyperLink();
            NavigationCreator.SetUrl(contact, link);
            Console.WriteLine(link.NavigateUrl);
        }

        Console.Read();
List items=newlist();
对于(int i=0;i<5;i++)
{
基本接触项目;
如果(i%2==0)项=新FbContact();否则项=新LinkedInContact();
item.Url=“我的名字”+i;
项目。添加(项目);
}
foreach(项目中的var联系人)
{
超级链接=新的超级链接();
NavigationCreator.SetUrl(联系人,链接);
Console.WriteLine(link.NavigateUrl);
}
Console.Read();

每个ContactTypeID都属于不同的超链接吗?我会在您的Contact类中创建一个方法,并使smth类似-
con.getNavigateUrl()
您希望为每个ContactTypeID做些什么-如果您做了几个if/else语句,这将帮助我们了解您想要完成的任务的要点。另外,您是否希望只有一个contacttypeid=1的联系人,或者您可以有10个具有该ID的联系人?每个contacttypeid是否都属于不同的超链接?我将在contact类中创建方法,并使smth类似-
con.getNavigateUrl()
对于每个ContactTypeID,您想做什么?如果您做了几个if/else语句,这将有助于我们了解您想要完成的任务的要点。此外,您是否希望只有一个contacttypeid=1的联系人,或者您可以有10个具有该ID的联系人?foreach会将navigateurl设置为las